Laravel:如果没有其他模型共享,则级联删除模型

时间:2018-07-06 02:01:53

标签: laravel eloquent

所以我有三种模型:发布页面图片。帖子和页面可以共享同一张图片,也可以拥有自己的图片。

删除帖子时,我想删除与该帖子相关的所有图像,但前提是这些图像是与其他任何内容相关的注释。例如,如果帖子中有图像,但页面也共享它,则该帖子不应级联删除该图像。

这是我的模特:

发布

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 :(得分:0)

代替调用$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 
                }
            });
        });
    }
}