2014-10-18 32 views
5

Domanda semplice: sono nuovo di Laravel. Ho questo file di migrazione:laravel migrazione modo migliore per aggiungere chiave esterna

Schema::create('lists', function(Blueprint $table) { 
    $table->increments('id'); 
    $table->string('title', 255); 
    $table->integer('user_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->timestamps(); 
}); 

voglio aggiornarlo per aggiungere onDelete('cascade').

Qual è il modo migliore per farlo?

risposta

7

In primo luogo è necessario per rendere il vostro user_id campo di un indice:

$table->index('user_id'); 

Dopo di che è possibile creare una chiave esterna con un'azione in cascata:

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 

Se si vuole farlo con una nuova migrazione, è necessario rimuovere l'indice e la chiave esterna in primo luogo e fare tutto da zero.

in giù() funzione dovete fare questo e poi su verso l'alto() fare quello che ho scritto sopra:

$table->dropForeign('lists_user_id_foreign'); 
$table->dropIndex('lists_user_id_index'); 
$table->dropColumn('user_id'); 
2

è necessario creare un nuovo file di migrazione Diciamo 'add_user_foreign_key.php'

public function up() 
{ 
    Schema::table('lists', function(Blueprint $table) 
    { 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
    }); 
} 

/** 
* Reverse the migrations. 
* 
* @return void 
*/ 
public function down() 
{ 
    Schema::table('lists', function(Blueprint $table) 
    { 
    $table->dropForeign('user_id'); // 
    }); 
} 

La corsa

php artisan migrate 
1
$table->integer('user_id')->unsigned(); 
$table->foreign('user_id')->references('id')->on('users'); 

In questo esempio, stiamo affermando che la colonna user_id fa riferimento alla colonna id nella tabella . Assicurati di creare prima la colonna chiave esterna! La colonna user_id è dichiarata senza segno perché non può avere un valore negativo.

È inoltre possibile specificare le opzioni per i "a eliminazione" e "a" aggiornamento azioni del vincolo:

$table->foreign('user_id') 
     ->references('id')->on('users') 
     ->onDelete('cascade'); 

Per escludere una chiave esterna, è possibile utilizzare il metodo dropForeign. Una convenzione di denominazione simile è usato per le chiavi esterne come viene utilizzato per altri indici:

$table->dropForeign('posts_user_id_foreign'); 

Se siete abbastanza nuovo per laravel e Eloquente, provare la serie Laravel From Scratch accessibile laracasts. È un'ottima guida per i principianti.

0

Se si desidera aggiungere onDelete('cascade'), basta eliminare gli indici e creare di nuovo:

public function up() 
{ 
    Schema::table('lists', function($table) 
    { 
     $table->dropForeign('lists_user_id_foreign'); 

     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
    }); 
} 

public function down() 
{ 
    Schema::table('lists', function($table) 
    { 
     $table->dropForeign('lists_user_id_foreign'); 

     $table->foreign('user_id')->references('id')->on('users'); 
    }); 
} 
Problemi correlati