Laravel-为什么级联删除的表不触发模型的删除事件?

时间:2019-09-20 14:59:17

标签: laravel

我的结构如下:

course week

给定的weekcourse表具有外键关系。

在我的courseweek的模型中,如果有删除,我可以执行一些操作。这是通过模型中的这种方法完成的:


public static function boot() {

        parent::boot();

        static::deleted(function($course) {
            // do some stuff;

        });
    }

当我使用以下行在后端删除course时:

\App\Course::find($id)->delete();

它触发deleted事件,我的代码转到上述deleted函数。

通过级联删除机制,week的{​​{1}}条目也被删除。我在数据库中确认,删除courseweek个条目消失了。

但是...未触发course的{​​{1}}模型事件。

编辑:从那以后,我了解到从数据库中级联删除将不会触发Laravel中的模型事件。因此,我尝试在week模型中手动删除deleted项,

week

那可以删除course项,但是static::deleted(function($course) { // override any cascade deletes and do it manually // first delete weeks of this course: \App\Week::where('course_id', $course->id)->get()->each(function($week) { $week->delete(); }); }); 模型的week事件仍然没有被触发,这是我所料想不到的。

想法?

谢谢

布莱恩

2 个答案:

答案 0 :(得分:0)

级联发生在数据库级别,因此,每当删除课程时,都需要手动触发事件,以便通知周观察者,这是一件很痛苦的工作,但是我认为可以做到这一点:

// I don't know your relationship, but this is the template that you should use
// Change App\Week with your model with full namespace, and pass the Week instance 
// as a parameter
event('eloquent.deleted: App\Week', $course->week);

根据您的修改,您需要执行以下操作才能工作:

\App\Week::where('course_id', $course->id)->get()->each(function($week) {
    $week->delete();
});

我无法对此进行测试,但是我确信它可以正常工作,因为事件会像您一样在Eloquent实例上触发,而不是在QueryBuilder上触发。

答案 1 :(得分:0)

这是因为执行delete语句时实际上从未检索过模型。 Laravel documentation中对此进行了很好的解释。

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