it-swarm.com.de

Fügen Sie "ON DELETE CASCADE" zur vorhandenen Spalte in Laravel hinzu

Ich habe die Spalte user_id fk in meiner Tabelle

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

Ich sollte on cascade delete feature zu dieser vorhandenen Spalte hinzufügen. Wie kann ich das machen?

24
Farid Movsumov

Lassen Sie zuerst den Fremdschlüssel fallen. Vielen Dank an Razor für diesen Tipp

$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
49
Farid Movsumov

Der Laravel Schema Builder kann die Spalten im aktuellen Status nicht ändern. Sie verwenden also Rohabfragen. Sie müssen die constraint 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);'
    );
}
4
Razor

In meinem Fall muss ich den Col-Namen in ein Array schreiben, ansonsten wird dies ein Fehler sein.

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

mySQL 5.7 Ver

2
shalonteoh

Danke für die Antwort auf die Frage. Hilf mir, diesen Arbeitscode in L5.1 zu finden:

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();
    });
}
2
JohnWolf
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
1
Mark Baker
$table->integer('user_id')->unsigned();    
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

Ich gehe davon aus, dass Sie Illuminate\Database\Schema\Blueprint::primary() verwendet haben, um users.id zu erstellen. Wenn dies der Fall ist, wird users.id nicht signiert. Daher muss Ihre Fremdschlüsselspalte user_id auch vorzeichenlos sein.

0
Inda5th

Die Antwort von Farid Movsumov hat für mich funktioniert. Sie sollten in der MySQL-Struktur nach "answers_user_id_foreign" suchen. Unten in phpmyadmin befindet sich eine Tabelle namens Indizes, in der Sie Ihre Entsprechung finden

0
Sallmin Rexha

Verwenden Sie die Funktion ohne Vorzeichen, um user_id in der aktuellen Migration zu verwenden:

$table->interger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');
0
Detroit Charan