我的应用程序具有Category
模型。每个Category
可以有多个Subcategories
,因此每个Subcategory
belongsTo
和一个Category
。在Subcategory
模型中:
public function category()
{
return $this->belongsTo('App\Category');
}
另一方面,有一个Friend
模型。现在,每个Friend/Subcategory
对都通过枢轴friend_score
表连接:
id | friend_id | subcategory_id | score
通过Subcategory
模型:
/**
* The friend scores that belong to the subcategory.
*/
public function friends()
{
return $this->belongsToMany('App\Friend', 'friend_score')->withPivot('score');
}
通过Friend
模型:
/**
* The subcategory scores that belong to the friend.
*/
public function subcategories()
{
return $this->belongsToMany('App\Subcategory', 'friend_score')->withPivot('score');
}
当我删除一个子类别时,Eloquent会自动正确地从{_1}}的friend_score表中删除条目。
删除类别时,它会正确删除属于该subcategory_id
的子类别。但是,在这种情况下,相关的friend_scores仍保留在数据库中。
在删除类别时,如何使它删除每个子子类别的friend_score?
我知道我可以手动遍历它们并删除它们,但是我想知道是否存在一种通过模型关系自动实现此目的的方法。
答案 0 :(得分:0)
在friend_score
迁移中,您可以将subcategory_id定义为外键。然后,您可以选择在删除子类别后使用onDelete()
方法对记录进行透视的操作。
$table->foreign('subcategory_id')
->references('id')
->on('subcategories')
->onDelete('cascade');
使用层叠选项,当删除子类别时,所有相关的数据透视记录将被删除。
因此,当您删除类别时,删除将通过子类别冒泡给朋友分数
类别->子类别->朋友得分(枢轴)
答案 1 :(得分:0)
您可以更新迁移并添加onDelete()
级联,这将是我处理此类情况的首选方式。但是,如果您真的希望手动执行此操作,则可以使用如下雄辩的事件:
Subcategory
型号:
/**
* Boot eloquent model events
*
* @return void
*/
public static function boot() {
parent::boot();
// This will be called just before deleting a
// subcategory entry
static::deleting(function($subcategory) {
Friend::where('subcategory_id', $subcategory->id)->delete();
});
}
在执行任何操作之前,您可以按照以下步骤进行清理:
Friend::whereDoesntHave('subcategories')->get();
检查以上内容是否返回与子类别表没有任何关系的条目的正确结果。然后,您可以调用->delete()
而不是->get()
来清理好友模型条目。