2014-11-08 6 views
19

I User_id fk Spalte in meinem Tisch habenhinzufügen "ON DELETE CASCADE" zu vorhandenen Spalte in Laravel

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

I auf Kaskade löschen Merkmal dieser bestehenden Spalte hinzufügen sollte. Wie kann ich das machen?

+0

Verwenden Sie rohe Abfrage 'DB :: Anweisung ('..')'. Wie lautet der Name Ihres Tisches? – Razor

+0

Der Name der Tabelle lautet "Antworten" –

Antwort

37

Wir sollten zuerst Fremdschlüssel fallen lassen. Danke an Razor für diesen Tipp

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

Wird dies in einer neuen Migration getan? –

+1

@BrentConnor Wenn es bereits migriert und in Produktion ist, ja. Andernfalls können Sie die Migration zurücksetzen, die ursprüngliche Datei bearbeiten und dann erneut migrieren. – Marcel

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

[Illuminate \ Database \ QueryException] SQLSTATE [HY000]: Allgemeiner Fehler: 1005 Tabelle 'xxx. # Sql-5d7_226' kann nicht erstellt werden (errno: 121) (SQL: alter table 'xxx' addition constraint answer_user_id_foreign Fremdschlüssel (' user_id ') verweist' user' ('id') auf delete cascade) –

+1

Es funktioniert nicht für die existierende Spalte –

+1

Dann solltest du es vielleicht als Bug melden, denn das ist der offiziell [dokumentierte Methode] (http://laravel.com/docs/4.2/schema#foreign-keys) –

3

Laravel Schema Builder kann keine Spalten im aktuellen Zustand ändern, so dass Sie rohe Abfragen verwenden. Sie müssen die Einschränkung löschen und neu erstellen:

PostgreSQL

function up() 
{ 
    DB::statement('alter table answers drop constraint answers_user_id_foreign, 
        add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id) 
        on delete cascade;' 
    ); 
} 
function down() 
{ 
    DB::statement('alter table answers drop constraint answers_user_id_foreign, 
        add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id);' 
    ); 
} 

MySQL

function up() 
{ 
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;'); 
    DB::statement('alter table answers add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id) 
        on delete cascade;' 
    ); 
} 
function down() 
{ 
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;'); 
    DB::statement('alter table answers add constraint answers_user_id_foreign 
        foreign key (user_id) 
        references users(id);' 
    ); 
} 
0
$table->integer('user_id')->unsigned();  
$table->foreign('user_id') 
     ->references('id')->on('users') 
     ->onDelete('cascade'); 

Ich gehe davon aus Sie Illuminate\Database\Schema\Blueprint::primary()users.id zu erstellen. Wenn das der Fall ist, wird users.id unsigned sein. Daher muss Ihre Fremdschlüsselspalte user_id ebenfalls nicht signiert sein.

2

Danke für die Frage zu beantworten. Helfen Sie mir, zu diesem Arbeitscode in L5.1 zu kommen:

public function up() 
{ 
    Schema::table('transactions', function (Blueprint $table) { 
     $table->dropForeign('transactions_order_id_foreign'); 
     $table->foreign('order_id') 
      ->references('id')->on('orders') 
      ->onDelete('cascade') 
      ->change(); 
    }); 

    Schema::table('orders', function (Blueprint $table) { 
     $table->dropForeign('orders_user_id_foreign'); 
     $table->foreign('user_id') 
      ->references('id')->on('users') 
      ->onDelete('cascade') 
      ->change(); 
    }); 
} 
Verwandte Themen