2016-07-13 32 views
0

Ich habe ein 'Rollen' Tabelle:Wie lösche ich bei Kaskade in Laravel?

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

und einen Tisch '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"); 

Wenn ich eine solche Linie auszuführen:

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

nur die zugehörige Zeile in Die Rolle Tabelle wird gelöscht, und verwandte Zeilen in der Roles_Users-Tabelle sind nicht. Was ist die Lösung?

+0

Um diese Art der Sache, ziehe ich es wirklich die Fremdschlüssel zu erstellen und „Cascade“ dann. Sie erzielen eine bessere Leistung. Wenn Sie beispielsweise Datensätze direkt über SQL löschen oder in einer anderen App auf Ihre Datenbank zugreifen müssen, behalten Ihre Daten ihre Integrität. –

Antwort

1

Ich empfehle, dass Sie einen „Fremdschlüssel“ Einschränkung für diesen Fall erstellen (wie andere erwähnt). Auch, weil dies eine many-to-many-Beziehung ist, können Sie detach() Methode auf Ihrem Eloquent Modell verwenden (wenn Sie die Beziehungen richtig in Ihren user und role Modellen sitzen)

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

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

Sie in die Dokumentation zu more details beziehen können .

+0

Vielen Dank! hier die echte Lösung: '$ role = Rolle :: where ('name', 'someString') -> first(); $ rolle-> benutzer() -> detach(); $ role-> delete(); ' – moh

0

Versuchen Sie, nach dem Erstellen von Spalten $table->index(['role_id', 'user_id']) und Fremdschlüssel anzuwenden. So wird Ihr Code aussehen

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