我的结构如下:
course
week
给定的week
与course
表具有外键关系。
在我的course
和week
的模型中,如果有删除,我可以执行一些操作。这是通过模型中的这种方法完成的:
public static function boot() {
parent::boot();
static::deleted(function($course) {
// do some stuff;
});
}
当我使用以下行在后端删除course
时:
\App\Course::find($id)->delete();
它触发deleted
事件,我的代码转到上述deleted
函数。
通过级联删除机制,week
的{{1}}条目也被删除。我在数据库中确认,删除course
时week
个条目消失了。
但是...未触发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
事件仍然没有被触发,这是我所料想不到的。
想法?
谢谢
布莱恩
答案 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语句时实际上从未检索过模型。