这应该是一个相当简单的问题,我可能会对我的问题得到解答的文档中的确切位置愚蠢/盲目但是:
Blog has many tags, tags belong to blog
post has many tags, tags belong to post
如果我这样做:TagModel::where('id', $id)->first()->delete();
会处理这些关系吗?如果我这样做:BlogsModel::where('id', $blogId)->tags
或甚至查看帖子,我不会看到已删除标签的关系,或者我是否需要首先从博客和帖子取消链接然后删除? ?
我认为laravel不会先找我链接吗?
答案 0 :(得分:2)
Laravel关系用于调用关系成员,它不用于删除,如果要自动删除关系表,有两种方法:
您需要在具有删除功能的数据库上添加关系
$table->foreign('blog_id')->references('id')->on('blog')->onDelete('cascade');
$table->foreign('post_id')->references('id')->on('blog')->onDelete('cascade');
或
您可以在模型上添加删除功能
您需要将此功能添加到代码模型中:
// Adding relation from tags to post
public function post()
{
return $this->belongsTo( PostModel::class, 'post_id' );
}
// Adding relation from tags to blog
public function blog()
{
return $this->belongsTo( BlogModel::class, 'blog_id' );
}
// Deleting relation table blog and post
protected static function boot() {
parent::boot();
static::deleting( function( $tag ) {
$tag->blog()->delete();
$tag->post()->delete();
});
}
所以当你运行这个函数时:
TagModel::where('id', $id)->first()->delete();
相关博客和帖子会自动删除。
如果您要删除标签及相关博客并发布未删除的内容,请不要在数据库中建立任何关系。
答案 1 :(得分:0)
关键是模型事件deleting
:
/**
* Events
*/
public static function boot()
{
parent::boot();
static::deleting(function($model) {
foreach($model->tags as $tag) {
$tag->delete();
}
}
}
此代码可以存在于模型本身中,也可以将其提取给模型观察者。