2016-07-13 71 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"); 
}) ;