2016-07-13 18 views
0

Iが 'ロール' のテーブルを持っている:Laravelのdelete on 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"); 

Iは、ライン実行すると:で

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

のみ関連する行Rolesテーブルは削除され、Roles_Usersテーブルの関連する行は削除されません。解決策は何ですか?

+0

この種のものには、私は本当に外部キーを作成し、 "カスケード"を設定することを好みます。パフォーマンスが向上します。たとえば、SQLを使用してレコードを直接削除するか、別のアプリでデータベースにアクセスする必要がある場合、データの整合性は保持されます。 –

答えて

1

このケースでは(前述のように)「外部キー」制約を作成することをお勧めします。これは、多対多の関係であるので、(あなたはuserroleモデルに正しく関係が座っていた場合)。また、あなたはあなたの雄弁モデルにdetach()メソッドを使用することができます

$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"); 
}) ; 
関連する問題