我有一个锦标赛模型,其中包含与会话模型的belongsToMany关系:
class Tournament extends Model{
public function sessions(){
return $this->belongsToMany(Session::class, 'tournament_has_sessions');
}
}
然后我的会话模型包含与用户模型的belongsToMany关系:
class Session extends Model{
public function users(){
return $this->belongsToMany(User::class, 'session_has_users');
}
}
现在,当我删除锦标赛时,我想删除session_has_users表中的所有会话和所有信息。
我试过了:
$tournament->sessions()->with('users')->delete(); -- < This
$tournament->sessions()->delete();
$tournament->users()->detach();
$tournament->delete();
但它不起作用。 session_has_users表中的数据仍然存在
我意识到我可以这样做:
DB::table('session_has_users')->whereIn('session_id', $this->sessions()->pluck('id'))->delete();
但是,有没有更有效/方便(甚至替代,如果不是更有效)的方式来实现这一目标?
答案 0 :(得分:3)
在外键上使用RDBMS参考操作
在数据库架构中,您应该使用ON DELETE CASCADE
操作定义外键。这将在删除引用的ID时自动删除相关记录。
(请参阅dbudimir对Laravel迁移文件中示例行的回答)
使用Eloquent分离所有相关模型
如果您没有使用外键,或者您的数据库缺乏对引用操作的支持,您可以使用:
$tourament->sessions()->sync([]);
sync方法接受要放在中间表上的ID数组。将从中间表中删除不在给定数组中的任何ID。因此,在此操作完成后,只有给定数组中的ID将存在于中间表中:
https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships
提供一个空数组应该删除所有关系。
答案 1 :(得分:3)
在表格&#39; tournament_has_sessions&#39;你可以像这样设置onDelete(&#39; cascade&#39;)
$table->integer('tournament_id')->unsigned()->nullable();
$table->foreign('tournament_id')->references('id')->on('tournaments')->onDelete('cascade');
$table->integer('session_id')->unsigned()->nullable();
$table->foreign('session_id')->references('id')->on('sessions')->onDelete('cascade');
当删除锦标赛自动删除此表中的所有记录时
答案 2 :(得分:2)
您可以使用以下任何一种方式:
$tourament->sessions()->detach();
或
$tourament->sessions()->sync([]);
或者您也可以像上面的答案一样使用ON DELETE CASCADE定义外键