我有这个模型,它使用静态引导来删除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();
});
}
但它不起作用。你能告诉我为什么这不起作用吗?逻辑上它应该工作,因为评论被删除。谢谢。
答案 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()
});