提问者:小点点

Laravel雄辩的静态引导删除多个关系


我有一个模型,它使用静态启动来删除数据库中的相关模型/表。首先是产品模型。

 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个答案

匿名用户

在第一个删除事件中,您正在调用$product-

为了执行这种类型的应用程序级级联删除,您需要确保删除仅在Comment实例上调用。你可以循环浏览相关记录并删除它们,或者获取它们的id列表并使用销毁()方法(在幕后循环):

// 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);
});

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

但是,如果您需要应用程序级级联删除(例如多态关系,应用程序架构师需要它们,等等),我确实有一个包可以为您解决这个问题:shiftonelabs/laravel-级联-删除。您只需在模型中添加一个特征,并定义要级联删除的关系数组,您就不需要担心其他任何事情。

匿名用户

这对我有用

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