2014-07-22 10 views
6

Ich habe eine Viele-zu-viele-Beziehung zwischen Benutzer & Role mit einer role_user-Tabelle. Meine Migrationen sind Setup als so (vereinfacht):Laravel-Fremdschlüssel onDelete ('cascade') funktioniert nicht

users Tabelle:

public function up() 
{ 
    Schema::create('users', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('email')->unique(); 
    }); 
} 

roles Tabelle:

public function up() 
{ 
    Schema::create('roles', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->string('name'); 
    }); 
} 

role_user Tabelle:

public function up() 
{ 
    Schema::create('role_user', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->integer('user_id')->unsigned(); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
     $table->integer('role_id')->unsigned(); 
     $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); 
    }); 
} 

So wie pro die docs, Ich habe meine Fremdschlüssel auf unsigniert gesetzt.

Jetzt füge ich ein paar Benutzer hinzu, und fügen Sie einige Rollen hinzu - alles funktioniert gut. Wenn ich jedoch einen Benutzer lösche (User::destroy(2)), werden die Zeilen für diesen Benutzer in der Tabelle role_user nicht gelöscht, was zu redundanten Zeilen führt.

Was mache ich falsch?

  • MySQL + InnoDB

EDIT: das Modell Grabbing und ->delete(); Anwendung hat auch die gleiche Wirkung.

+0

Haben Sie Beziehungen in MySQL erstellt? Überprüfen Sie Ihre Tabellenstruktur in Software wie PHPMyAdmin. Versuchen Sie auch, '$ table-> integer ('user_id') zu entfernen -> unsigned();' –

+0

Ich habe PHPMyAdmin installiert - wo sehe ich die Beziehungen? Will einen Blick haben. – Alias

+0

http://www.binarytides.com/blog/wp-content/uploads/2009/08/phpmyadmin_relation_view-600x443.png Dies kann helfen –

Antwort

11

Versuchen Sie die Einstellung, wenn Sie versuchen, diese Tabelle zu erstellen. Diese Lösung hat für mich funktioniert.

$table->engine = 'InnoDB'; 

Ich habe einen Fehler abgelegt unter: https://github.com/laravel/framework/issues/8730

+0

Dieses Problem tritt höchstwahrscheinlich auf, weil die Standardtabellen-Engine in Ihrer MySQL-Instanz auf MyISAM gesetzt ist, das Fremdschlüssel nicht unterstützt. Der Versuch, mit fremden Schlüsseln auf einer MyISAM-Tabelle zu arbeiten, wäre definitiv kein Fehler in Laravel. Es wäre zwar schön, wenn der Schema-Builder die Engine automatisch auf InnoDB setzen könnte, wenn Fremdschlüssel verwendet werden. –

+0

Stellen Sie sicher, dass Sie es zu allen Migrationen hinzufügen oder es würde nicht funktionieren. – Pyol7

1

überprüfen mysql Konfig. my.ini kann immer noch default-storage-engine = MYISAM haben. Setzen Sie den Wert auf default-storage-engine = InnoDB und vermeiden Sie das Problem, diesen Fix zu jeder Migration hinzuzufügen.