Eloquent Observer没有开火

时间:2017-01-06 08:04:18

标签: php laravel eloquent

我有两个模型,ShowEpisode,有一对多的关系。我有一个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();是否存在错误,或者这可能是错误?

1 个答案:

答案 0 :(得分:3)

查看文档(在红色警告区块上):https://laravel.com/docs/5.3/eloquent#deleting-models

  

通过Eloquent执行批量删除语句时,删除的模型不会触发删除和删除的模型事件。这是因为在执行delete语句时,实际上从未检索过模型。

这与update电话相同。

因此,如果您需要触发事件,您别无选择,只能逐个删除它,或者如果性能至关重要,则激活您自己的自定义事件。