简体   繁体   中英

Eloquent Observer not firing

I have two models, Show and Episode , with a one to many relationship. I have an Observer for each model to watch when they are deleted and do some tasks. If my ShowObserver looks like this everything works properly and cascades down, the EpisodeObserver fires its deleting() method for each Episode that is deleted along with the show:

<?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();
    }
}

However, if I change it to looks like this the EpisodeObserver@deleting() methods never fire even though the Episode s do get forceDeleted:

<?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();
    }
}

Is there something about $show->episodes()->onlyTrashed()->forceDelete(); that is incorrect, or is this potentially a bug?

Check out the documentation (on the red warning block): https://laravel.com/docs/5.3/eloquent#deleting-models

When executing a mass delete statement via Eloquent, the deleting and deleted model events will not be fired for the deleted models. This is because the models are never actually retrieved when executing the delete statement.

This is also same to update call.

So if you need to fire the events, you have no choice but to delete it one by one, or fire your own custom event if performance is critical.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM