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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel:级联删除模型,如果没有其他模型共享它相关的知识,希望对你有一定的参考价值。

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

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

这是我的模特:

岗位

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

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

图片

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

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

通常,我只会做$ post-> images() - > delete(),但我需要首先检查这些图像中是否有任何一个属于另一个模型。

答案

而不是调用$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 
                }
            });
        });
    }
} 

以上是关于Laravel:级联删除模型,如果没有其他模型共享它的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 级联删除

为啥 Django 模型级联删除在现实世界中会失败?

核心数据模型级联删除和父实体

如何使用不会将删除级联到其子级的 ForeignKeys 创建 Django 模型?

PythonDjango数据模型级联删除级联更新ER图导出等

Laravel:自定义或扩展通知 - 数据库模型