所以我有三个模型:帖子、页面和图像。帖子和页面可以共享相同的图像,也可以拥有自己的图像。
当我删除帖子时,我想删除与该帖子相关的所有图像,但前提是这些图像与其他任何内容相关。例如,如果帖子有图像,但它也由页面共享,则帖子不应在级联中删除该图像。
这是我的模型:
发布
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
}
});
});
}
}