当前位置: 首页 > 知识库问答 >
问题:

如何删除Laravel 5.5中的多关系模型

宋智明
2023-03-14

我有三张桌子

书籍:-id-姓名-已删除

帖子:-id-图书id-连接-删除地址

评论:-id-帖子id-评论-已删除

一本书有很多帖子,一篇帖子有很多评论。

当我删除一本书时,我想删除与该书相关的帖子和评论。我已经在所有模型中添加了关系,所有表都使用SoftDelete,并尝试在Laravel中使用事件

// Book Model
protected static function boot() {
    parent::boot();
    static::deleting(function($book) {
         $book->posts()->delete();
    });
}

// Post Model
protected static function boot() {
    parent::boot();
    static::deleting(function($post) {
         $post->comments()->delete();
    });
}

当我尝试删除一本书时:

$book = Book:find($bookId);
$book->delete()

书籍和帖子已删除,但评论不会被删除。我可以用Laravel事件删除评论吗?感谢您的阅读!

共有3个答案

房学文
2023-03-14

您可以使用michaeldyrynda制作的这个整洁的小特性,称为laravel-catcade-soft-deles。

GitHub自述文件中的示例代码:

<?php

namespace App;

use App\Comment;
use Iatstuti\Database\Support\CascadeSoftDeletes;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes, CascadeSoftDeletes;

    protected $cascadeDeletes = ['comments'];

    protected $dates = ['deleted_at'];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}    
燕刚捷
2023-03-14

您应该将DELETE触发器上的模型关系设置为CASCADE。否则,您将需要迭代相关记录并逐个删除它们。

$model->related->each(function ($related) { $related->delete(); });

编辑:你对模型事件的想法是正确的,但是先删除帖子,然后再反向工作到书籍

protected static function boot() {
    parent::boot();

    static::deleting(function($post) {
        $post->comments()->delete();
    });
}

确保您的模型都具有“软删除特征”和“日期”属性:

 use SoftDeletes;
protected $dates = ['deleted_at'];
闻人修明
2023-03-14

您正在Post模型的delete事件中传递不同的变量。

// Post Model
protected static function boot() {
    parent::boot();
    static::deleting(function($post) {
         // $book->comments()->delete();
         $post->comments()->delete();
    });
}
 类似资料:
  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 问题内容: 在一个模型中,我有这个: 如果我选择: 有用。 如何从关系中删除所有对象?不管用。 问题答案: 首先,你需要使用或来清除关系,根据docs,哪种更适合你的需求。 之后,你需要使用删除对象。方法。

  • 我的实体: 这就是我的问题,实际上很少有。 问题1: 我删除了一个Cat对象,设置了cascade类型。所有在Cat中拥有的列表中,因此当我删除Cat对象时,UC中带有Cat的所有记录都将被删除,但我得到“已删除的对象将通过级联重新保存”,这是因为我在UC中与用户有另一个关系,用户将UC存储在列表中。当我从UC中删除Cat对象和记录时,我不想删除用户对象,因此在UC中的@ManyToOne上设置c

  • 在一个理论实体中,我有这样的配置: 当我删除实体时,它会尝试首先删除表,而不是连接的表,因此我会得到以下错误:

  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml

  • 我正在使用hibernate多对多的关联。我有3个表(STUDENT,COURSE和STUDENT_COURSE)。在3个表中,2个是主表,1个是提供关系的中间表。当记录从STUDENT中删除时,相应的映射将从Student_Course中删除。我的要求是它甚至应该从课程表中删除记录。考虑以下STUDENT_COURSE条目: 当从学生表中删除101时,上述表中的第一个条目被删除,但课程表中对应于