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

Joa*_*oas 6 laravel eloquent laravel-5

我有一个 Tournament 模型,其中包含与 Session 模型的belongsToMany 关系:

class Tournament extends Model{

    public function sessions(){
        return $this->belongsToMany(Session::class, 'tournament_has_sessions');
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的会话模型包含与用户模型的belongsToMany 关系:

class Session extends Model{

    public function users(){
        return $this->belongsToMany(User::class, 'session_has_users');
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我删除锦标赛时,我想用它删除 session_has_users 表中的所有会话和所有信息。

我试过了:

$tournament->sessions()->with('users')->delete(); -- < This
$tournament->sessions()->delete();
$tournament->users()->detach();
$tournament->delete();
Run Code Online (Sandbox Code Playgroud)

但它不起作用。session_has_users 表中的数据持久化

我意识到我可以做这样的事情:

DB::table('session_has_users')->whereIn('session_id', $this->sessions()->pluck('id'))->delete();
Run Code Online (Sandbox Code Playgroud)

但是有没有更有效/更方便(或者即使不是更有效的替代方法)来实现这一目标?

Dev*_*von 16

对外键使用 RDBMS 引用操作

在数据库模式中,您应该使用操作定义外键ON DELETE CASCADE。这将在删除引用的 id 时自动删除相关记录。

(有关 Laravel 迁移文件中的示例行,请参阅 dbudimir 的回答)


使用 Eloquent 分离所有相关模型

如果您不使用外键或您的数据库缺乏对引用操作的支持,您可以使用:

$tourament->sessions()->sync([]);
Run Code Online (Sandbox Code Playgroud)

同步方法接受要放置在中间表上的一组 ID。任何不在给定数组中的 ID 都将从中间表中删除。因此,此操作完成后,中间表中将只存在给定数组中的 ID:

https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

提供一个空数组应该删除所有关系。


小智 7

在表 'tournament_has_sessions' 中,您可以像这样设置 onDelete('cascade')

$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');
Run Code Online (Sandbox Code Playgroud)

并且当delete锦标赛自动删除该表中的所有记录


The*_*eky 5

您可以使用其中任何一个:

$tourament->sessions()->detach();

或者

$tourament->sessions()->sync([]);

或者您可以使用 ON DELETE CASCADE 定义外键,如上面的答案