Laravel - почему каскадно удаленные таблицы не вызывают удаленное событие модели? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть следующая структура:

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 для course также удаляются.Я подтверждаю это в своей базе данных, что записи week исчезают при удалении course.

Однако ... Событие week Model для deleted не вызывается.

Edit: я с тех пор узнал, что каскадное удаление из базы данных не вызовет события модели в Laravel.Поэтому я попытался выполнить удаление элементов 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 очень хорошо, но событие deleted для модели weekвсе еще не сработало, что я нахожу неожиданным ..

Идеи?

Спасибо,

Брайан

1 Ответ

0 голосов
/ 20 сентября 2019

Каскад происходит на уровне БД, поэтому вам нужно будет вручную запускать событие всякий раз, когда вы удаляете курс, чтобы уведомить наблюдателя за неделю, это немного болезненная работа, но я думаю, что это может сделать это:

// 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, как вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...