2015-12-06 13 views
6

ho bisogno di usare chiave esterna per il mio database, ma non riesco a fare questo, dopo comando di migrazione corsa in linea di comando, ottengo questo errore:come utilizzare chiave esterna in laravel 5.1 migrazione

[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

Campioni migrazione: la migrazione

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

fornitore:

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

cerco di che con la nuova migrazione per i campioni, ma 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'); 
     }); 

cerco di correggere la lunghezza della chiave primaria a 10, ma senza successo ancora una volta

risposta

4

L'ordine conta.

Si desidera essere sicuri che la tabella "fornitori" esista prima di tentare di fare riferimento a una colonna su tale tabella come un vincolo.

quindi se si desidera impostare voi vincolo di chiave esterna durante la creazione tabella quindi assicurarsi che si crea il "fornitori" migrazione prima e le "campioni" migrazione in seguito:

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

. ..add codice dello schema per i tuoi file di migrazione. e poi:

php artisan migrate 

Se non volete preoccuparvi di l'ordine in cui vengono create le tabelle allora fare il vostro creare migrazioni tavolo prima, senza i vincoli di chiave esterna, e poi fare una migrazione ulteriore da aggiungere le tue chiavi estranee.

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 

... aggiungere il codice dello schema ai file di migrazione. e poi:

php artisan migrate 
1

provare come questo senso

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

dico fare questo, ma infruttuoso –

+1

Prima eseguire la migrazione dei fornitori, poi assaggiare migration.Cause senza fornitore migration migration_id non funzionerà come chiave esterna –

2

Finalmente generare una migrazione per la tabella tenere a mente che dovrebbero essere in ordine se sentite qualche difficoltà basta nominare i vostri table_foreign_keys

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

posto tutte le chiavi estranee relative qui finalmente ed esegui

0

KorreyD dire vero! , Ma ho creato le migrazioni, e poi rinominato la migrazione per riordinarli, È così semplice:

Prima rinominato: migrazione

fornitore: 2015_08_ _104217_supllier_table.php

campioni di migrazione: 2015_08_ _102325_samples_table.php

Dopo rinominato:

campioni di migrazione: 2015_08_ _102325_samples_table.php

migrazione fornitore: 2015_08_ _104217_supllier_table.php

il mio problema risolto! perché run migrazione fornitore prima della migrazione campioni

Commento: cerco di questo con riflettore, che rinominato ogni dove quel nome migrazione utilizzato

+0

Ho anche avuto problemi con queste cose. Dai un'occhiata a laravelsd.com. È possibile creare una struttura di database e quindi esportarla. Crea migrazioni e inserisce tutte le associazioni di tasti nell'ultimo file. –

+0

Ottimo! sì, funziona anche Non ho menzionato questo metodo poiché non sono un esperto di laravel e non sono sicuro di eventuali problemi che potrebbero sorgere dalla ridenominazione dei file di migrazione. – KorreyD