如何在Laravel中使用级联删除?

时间:2016-07-13 11:11:13

标签: php mysql laravel cascade

我有一个'角色'表:

$table->increments('id');
$table->string('name')->unique();
$table->text('description')->nullable();

和'Roles_Users'表:

$table->increments('id');
$table->integer('role_id')->unsigned()->index()->foreign()->references("id")->on("roles")->onDelete("cascade");
$table->integer('user_id')->unsigned()->index()->foreign()->references("id")->on("users")->onDelete("cascade");

当我跑这样一条线时:

Role::where('name','someString')->delete();

仅删除Roles表中的相关行,而不删除Roles_Users表中的相关行。解决方案是什么?

2 个答案:

答案 0 :(得分:2)

我建议你为这种情况创建一个“外键”约束(正如其他人提到的那样)。另外,因为这是多对多关系,您可以在您的Eloquent模型上使用detach()方法(如果您在userrole模型中正确地处理了关系)

$user = App\User::find(1);

// Detach all roles from the user...
$user->roles()->detach();

您可以参考more details的文档。

答案 1 :(得分:0)

尝试在创建列后应用$table->index(['role_id', 'user_id'])和外键。所以你的代码看起来像

Schema::table('role_users', function($table){
    $table->increments('id') ;
    $table->integer('role_id')->unsigned() ;
    $table->integer('user_id')->unsigned()
});
Schema::table('role_users', function($table){
    $table->index(['role_id', 'user_id'])
}) ;
Schema::table('role_users', function($table){
    $table->foreign()->references("id")->on("roles")->onDelete("cascade");
    $table->foreign()->references("id")->on("users")->onDelete("cascade");
}) ;