2016-07-13 28 views
0

我有一個 '角色' 表:如何在Laravel中使用級聯刪除?

$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表中的相關行則不會被刪除。解決辦法是什麼?

+0

對於這種事情,我更喜歡創建外鍵並設置「Cascade」。例如,如果您需要直接通過SQL刪除記錄或在其他應用程序中訪問數據庫,則數據將保持其完整性。 –

回答

1

我建議你爲這種情況創建一個「外鍵」約束(如其他人提到的)。也正因爲這是一個多一對多的關係,你可以在你的口才模型中使用detach()方法(如果您在userrole模型正確坐在關係)

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

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

可以涉及文檔more details

+0

非常感謝!這裏真正的解決方案: '$ role = Role :: where('name','someString') - > first(); $ role-> users() - > detach(); $ role-> delete();' – moh

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"); 
}) ;