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

问题描述 投票:0回答:1

所以我有三个模型:Post,Page和Image。帖子和页面可以共享相同的图像,或者他们可以拥有自己的图像。

当我删除帖子时,我想删除与该帖子相关的所有图像,但仅当这些图像与其他任何内容相关时才会被删除。例如,如果帖子有图像但页面也共享,则帖子不应该在级联上删除该图像。

这是我的模特:

岗位

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(),但我需要首先检查这些图像中是否有任何一个属于另一个模型。

laravel eloquent
1个回答
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 
                }
            });
        });
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.