2015-12-06 25 views
6

Fremdschlüssel verwenden, ich Fremdschlüssel für meine Datenbank verwenden müssen, aber ich kann das nicht tun, nachdem Befehl Migrationslauf in der Befehlszeile, bekomme ich diesen Fehler:wie in Laravel 5.1 Migration

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table samples add constraint s amples_supplier_id_foreign foreign key (supplier_id) references suppliers (id))

[PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

Proben Migration:

Schema::create('samples', function (Blueprint $table) { 
      $table->Increments('id',true); 
      $table->string('variety',50); 
      $table->integer('supplier_id')->unsigned(); 
      $table->foreign('supplier_id')->references('id')->on('suppliers'); 
      $table->string('lot_number'); 
      $table->date('date'); 
      $table->integer('amount'); 
      $table->integer('unit_id')->unsigned(); 
      $table->foreign('unit_id')->references('id')->on('unit'); 
      $table->string('technical_fact'); 
      $table->string('comments'); 
      $table->string('file_address'); 
      $table->integer('category_id')->unsigned(); 
      $table->foreign('category_id')->references('id')->on('category'); 
      $table->timestamps(); 
     }); 

Lieferant Migration:

Schema::create('suppliers', function (Blueprint $table) { 
      $table->Increments('id',true); 
      $table->string('supplier',50); 
      $table->timestamps(); 
     }); 

ich zu versuchen, dass mit neuer Migration für die Proben, aber unsucce ssful:

Schema::create('samples', function (Blueprint $table) { 
       $table->Increments('id',true); 
       $table->string('variety',50); 
       $table->integer('supplier_id')->unsigned(); 
       $table->string('lot_number'); 
       $table->date('date'); 
       $table->integer('amount'); 
       $table->integer('unit_id')->unsigned(); 
       $table->string('technical_fact'); 
       $table->string('comments'); 
       $table->string('file_address'); 
       $table->integer('category_id')->unsigned(); 
       $table->timestamps(); 
     }); 

     Schema::table('samples', function($table) { 
      $table->foreign('supplier_id')->references('id')->on('suppliers'); 
      $table->foreign('unit_id')->references('id')->on('unit'); 
      $table->foreign('category_id')->references('id')->on('category'); 
     }); 

Ich versuche zu 10 Länge des Primärschlüssels zu beheben, aber erfolglos wieder

Antwort

4

Bestellung aus.

Sie möchten sicherstellen, dass Ihre Tabelle "Lieferanten" existiert, bevor Sie versuchen, auf eine Spalte in dieser Tabelle als Einschränkung zu verweisen.

so, wenn Sie möchten, dass Sie Fremdschlüssel setzen, während die Tabelle erstellen dann stellen Sie sicher, dass Sie die „Lieferanten“ Migration erste und die „Proben“ Migration danach erstellen:

php artisan make:migration create_suppliers_table --create=suppliers 
php artisan make:migration create_samples_table --create=samples 

. ..Add Schema-Code zu Ihren Migrationsdateien. und dann:

php artisan migrate 

Wenn Sie nicht wollen, über den Auftrag kümmern, in denen die Tabellen erstellt werden, dann haben Sie Ihren Tisch Migrationen zuerst erstellen, ohne die Fremdschlüssel-Constraints, und dann eine zusätzliche Migration zu tun hinzufügen Ihre Fremdschlüssel.

php artisan make:migration create_samples_table --create=samples 
php artisan make:migration create_suppliers_table --create=suppliers 
php artisan make:migration alter_samples_table --table=samples <-- add your foreign key constraints to this migration file 

... fügen Sie Ihren Migrationsdateien Schemacode hinzu. und dann:

php artisan migrate 
1

versuchen, wie diese Weise

Schema::table('samples', function($table) { 
     $table->integer('supplier_id')->unsigned(); 
     $table->foreign('supplier_id')->references('id')->on('suppliers'); 
     $table->integer('unit_id')->unsigned(); 
     $table->foreign('unit_id')->references('id')->on('unit'); 
     $table->integer('category_id')->unsigned(); 
     $table->foreign('category_id')->references('id')->on('category'); 
    }); 
+0

ich das sage, aber erfolglose –

+1

erste Anbieter Migration ausführen, dann migration.Cause probieren ohne Lieferantenmigration supplier_id funktioniert nicht als Fremdschlüssel –

2

Endlich eine Migration für die Tabelle im Auge behalten erzeugen dass sie in Ordnung sein sollten, wenn Sie irgendwelche Schwierigkeiten haben, benennen Sie einfach Ihre table_foreign_keys

Platzieren Sie alle Fremdschlüssel, die hier zuletzt verwandt sind, und führen Sie

0

KorreyD sagen wahr! , Aber ich Migrationen erstellt und umbenannt dann die Migration sie neu zu ordnen, es ist so einfach:

Bevor umbenannt:

Lieferant Migration: 2015_08_ _104217_supllier_table.php

Proben Migration: 2015_08_ _102325_samples_table.php

Nach umbenannt:

Proben Migration: 2015_08_ _102325_samples_table.php

Lieferant Migration: 2015_08_ _104217_supllier_table.php

mein Problem gelöst! weil Anbieter Migrationslauf vor der Proben Migration

Kommentar: I mit Reflektor zu versuchen, diese, die umbenannt, wo jeder, dass verwendete Migration Name

+0

Ich habe auch mit diesen Dingen gekämpft. Werfen Sie einen Blick auf laravelsd.com. Sie können dort eine Datenbankstruktur erstellen und dann alles exportieren. Es erstellt Migrationen und fügt alle Schlüsselbindungen in die letzte Datei ein. –

+0

Großartig! ja das klappt auch. Ich habe diese Methode nicht erwähnt, da ich kein Laravel-Experte bin und mir keine Probleme bei der Umbenennung von Migrationsdateien ergeben. – KorreyD