我有两个模型,Show
和Episode
,有一对多的关系。我有一个Observer,每个模型都可以在删除它们时进行观察并完成一些任务。如果我的ShowObserver
看起来像这样,一切正常并且级联下来,EpisodeObserver
会针对与节目一起删除的每个deleting()
触发Episode
方法:
<?php
/**
* Listen to the Show deleting event.
*
* @param Show $show
* @return void
*/
public function deleting(Show $show)
{
if ($show->isForceDeleting()) {
foreach ($show->episodes()->onlyTrashed()->get() as $episode) {
$episode->forceDelete();
}
} else {
$show->episodes()->delete();
}
}
但是,如果我将其更改为这样,即使EpisodeObserver@deleting()
s得到forceDeleted,Episode
方法也不会触发:
<?php
/**
* Listen to the Show deleting event.
*
* @param Show $show
* @return void
*/
public function deleting(Show $show)
{
if ($show->isForceDeleting()) {
$show->episodes()->onlyTrashed()->forceDelete();
} else {
$show->episodes()->delete();
}
}
$show->episodes()->onlyTrashed()->forceDelete();
是否存在错误,或者这可能是错误?
答案 0 :(得分:3)
查看文档(在红色警告区块上):https://laravel.com/docs/5.3/eloquent#deleting-models
通过Eloquent执行批量删除语句时,删除的模型不会触发删除和删除的模型事件。这是因为在执行delete语句时,实际上从未检索过模型。
这与update
电话相同。
因此,如果您需要触发事件,您别无选择,只能逐个删除它,或者如果性能至关重要,则激活您自己的自定义事件。