2016-05-20 12 views
2

Ich habe folgende Migration:Laravel Migrationsproblem: Tabelle Selbst Beziehung

Schema::create('tags', function (Blueprint $table) { 
      $table->increments('id')->unsigned()->index(); 
      $table->string('name',30); 
      $table->integer('parent_id')->nullable(); 
      $table->string('image_url'); 
      $table->string('image_id',50); 
      $table->timestamps(); 

      $table->foreign('parent_id') 
        ->references('id')->on('tags') 
        ->onDelete('cascade'); 
     }); 

Das folgende Problem aufkommt:

(errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alte 
    r table `tags` add constraint `tags_parent_id_foreign` foreign key (`parent_id`) references `tags` (`id`) on delete cascade) 

Alles ist gut. Ich habe viel geprüft, aber nicht funktioniert.

Die folgende Frage funktioniert nicht für mich. Ich weiß nicht warum, diese Frage geht nicht auf meine Probleme ein.

StackOverFlow Question

+0

Mögliches Duplikat von [Laravel-Migrationsselbstverweis-Fremdschlüsselproblem] (http://stackoverflow.com/questions/18427391/laravel-migration-self-referencing-foreign-key-issue) – Samsquanch

Antwort

2
$table->increments('id') 

ist eine Abkürzung für den Spalt Typen Integer-> unsigned

Grundsätzlich Sie versuchen, eine ganze Zahl ohne Vorzeichen auf eine ganze Zahl zu verknüpfen, so mysql werden Sie nicht zulassen, da die Werte im Bereich don 't Spiel (positive ganze Zahl nur gegen alle ganzen Zahlen)

Wenn Sie Ihren Code dies ändern:

$ table-> integer (' paren t_id ') -> unsigned() -> Nullable();

Dann wird mysql sehen, dass beide Seiten der Beziehung den gleichen Werttyp haben (Wertebereich aller positiven ganzen Zahlen auf beiden Seiten), so dass die Beziehung korrekt ist.

Als eine Randnotiz und für die Verwunderung kann eine Beziehung auf keiner, einer oder beiden Seiten der Relation nullbar sein, weil Nullable eine Einschränkung, kein Typ ist.

0

Fremdschlüsselarten müssen mit dem Feld übereinstimmen, auf das sie verweisen. Sie haben Ihre "ID" als nicht signiert, aber das Fremdschlüsselfeld ist nicht.