Laravel删除belongsToMany关系中的所有belongsToMany关系

时间:2017-12-05 17:34:54

标签: laravel laravel-5 eloquent

我有一个锦标赛模型,其中包含与会话模型的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();

但是,有没有更有效/方便(甚至替代,如果不是更有效)的方式来实现这一目标?

3 个答案:

答案 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定义外键

相关问题