Laravel雄辩的静态启动删除多个关系

时间:2017-03-13 13:54:01

标签: laravel eloquent

我有这个模型,它使用静态引导来删除db中的相关模型/表。 首先是产品型号。

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

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

它删除了心灵和评论,它的工作就像一个魅力。但问题是我有这个回复模型与我的评论模型有关系,而回复模型是从评论模型中引用的

public function replies()
{
    return $this->hasMany("App\Reply");
}

然后在我的评论模型中,我使用另一个静态启动来“链接”产品的启动删除

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

    static::deleting(function($comment) { 
        $comment->replies()->delete();
    });
}

但它不起作用。你能告诉我为什么这不起作用吗?逻辑上它应该工作,因为评论被删除。谢谢。

2 个答案:

答案 0 :(得分:1)

在您的第一个deleting事件中,您正在呼叫$product->comments()->delete();。这一行实际上是在查询构建器对象上调用delete()方法,而不是Comment模型。由于在删除过程中未创建Comment个模型,因此deleting上的Comment事件将不会被执行。

为了执行此类应用程序级别级联删除,您需要确保仅在Comment个实例上调用删除。您可以遍历相关记录并删除它们,或获取其ID列表并使用destroy()方法(在幕后执行循环):

// do a loop yourself
static::deleting(function($product) {
    foreach ($product->comments as $comment) {
        $comment->delete();
    }
});

// or, destroy all the ids
static::deleting(function($product) {
    $ids = $product->comments()->lists('id')->all();
    Comment::destroy($ids);
});

说了这么多,如果你有简单的关系和修改数据库的权限,你可能想要设置数据库级别的级联删除。这将比应用程序级别级联删除快得多,因为您不需要为每个要删除的记录加载每个模型。

但是,如果您处于需要应用程序级别级联删除的情况(例如,多态关系,应用程序架构师需要它们等),我确实有一个包来处理这个问题:{3 }}。您只需在模型中添加特征并定义要级联删除的关系数组,您就不必担心其他任何事情。

答案 1 :(得分:0)

这对我有用

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