Laravel: Каскадное удаление модели, если не другие модели делят ее - PullRequest
0 голосов
/ 06 июля 2018

Итак, у меня есть три модели: Сообщение , Страница и Изображение . Сообщение и страница могут использовать одно и то же изображение или иметь свои собственные изображения.

Когда я удаляю сообщение, я хочу удалить все изображения, связанные с этим сообщением, но только в том случае, если эти изображения отмечены примечаниями, относящимися к чему-либо еще. Например, если в сообщении есть изображение, но оно также передается на страницу, сообщение не должно удалять это изображение в каскаде.

Вот мои модели:

Сообщение

class Post extends Model
{
    public function images(){
        return $this->morphToMany('App\Image', 'imageable');
    }
}

Страница

class Page extends Model
{
    public function images(){
        return $this->morphToMany('App\Image', 'imageable');
    }
}

Изображение

class Image extends Model
{
    public function post()
    {
        return $this->morphedByMany('App\SocialPost', 'imageable');
    }

    public function pages()
    {
        return $this->morphedByMany('App\SocialPublication', 'imageable');
    }
}

Обычно, я бы просто сделал $ post-> images () -> delete (), но сначала мне нужно проверить, принадлежит ли какое-либо из этих изображений другой модели.

1 Ответ

0 голосов
/ 06 июля 2018

Вместо вызова $post->images()->delete() вы можете прослушать событие удаления модели в AppServiceProvider, например,

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Post::deleting(function ($post) {
            $post->images->map(function ($image) {
                if($image->pages()->count() == 0){
                    $image->delete(); //now delete 
                }
            });
        });
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...