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

Lesezeit: 4 Minuten

Benutzer-Avatar
Farid Movsumov

Ich habe die Spalte user_id fk in meiner Tabelle

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

sollte ich hinzufügen auf Kaskadenlöschung Funktion zu dieser vorhandenen Spalte hinzufügen. Wie kann ich das machen?

  • Verwenden Sie eine Rohabfrage DB::statement('..'). Wie heißt dein Tisch?

    – Rasierer

    8. November 2014 um 23:23 Uhr

  • Name der Tabelle ist “Antworten”

    – Farid Movsumov

    8. November 2014 um 23:24 Uhr

Benutzer-Avatar
Farid Movsumov

Legen Sie zuerst den Fremdschlüssel ab. Danke Razor für diesen Tipp

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

  • @BrentConnor Wenn es bereits migriert und in Produktion ist, ja. Andernfalls können Sie die Migration rückgängig machen, die Originaldatei bearbeiten und dann erneut migrieren.

    – Marcel Gruber

    10. September 2015 um 22:32 Uhr

  • Zumindest in Laravel 5.7 in $table->dropForeign(‘answers_user_id_foreign’); muss sein: $table->dropForeign([‘template_id’]);

    – D0rm1nd0

    11. Dezember 2018 um 13:38 Uhr


  • kürzer und Sie müssen die Namenskonvention beim Löschen des Fremdschlüssels nicht kennen: $table->dropForeign([‘user_id’])

    – Wütender UbuntuNerd

    11. März 2019 um 18:18 Uhr


  • Was passiert mit Daten in diesen Spalten oder der Tabelle, wenn wir den Fremdschlüssel löschen?

    – Prafulla Kumar Sahu

    17. April 2019 um 11:37 Uhr

  • @PrafullaKumarSahu Sie lassen nur die Fremdschlüsseldefinition fallen. Sie verlieren keine Daten.

    – Farid Movsumov

    24. April 2019 um 9:04 Uhr

In meinem Fall muss ich den Spaltennamen in ein Array einfügen, sonst wird das 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

  • $table->dropForeign([‘tank_id’]); $table->foreign(‘tank_id’)->references(‘id’)->on(‘tanks’)->onDelete(‘cascade’)->change();

    – Biswajit Biswas

    24. November 2021 um 10:37 Uhr

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

  • [Illuminate\Database\QueryException] SQLSTATE[HY000]: Allgemeiner Fehler: 1005 Kann Tabelle ‘xxx.#sql-5d7_226’ nicht erstellen (Fehlernummer: 121) (SQL: alter table xxx Einschränkung hinzufügen answers_user_id_foreign Fremdschlüssel (user_id ) Verweise users (id) auf Löschkaskade)

    – Farid Movsumov

    8. November 2014 um 23:16 Uhr


  • Dann sollten Sie es vielleicht als Fehler melden, denn das ist das Offizielle dokumentierte Methode

    – Markus Bäcker

    9. November 2014 um 0:09 Uhr

Benutzer-Avatar
Rasierer

Der Laravel-Schema-Builder kann im aktuellen Zustand keine Spalten ändern, daher verwenden Sie Rohabfragen. Sie müssen die löschen und neu erstellen Zwang:

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

Danke für die Antwort auf die Frage. Helfen Sie mir, zu diesem Arbeitscode in L5.1 zu gelangen:

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

Benutzer-Avatar
Feinfuß

Verwenden Sie die vorzeichenlose Funktion zu user_id in der aktuellen Migration:

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

Benutzer-Avatar
Genaues Design

Ab laravel 7.0 Sie können verwenden $table->foreignId('user_id'); es ist ein Alias ​​von $table->unsignedBigInteger('user_id');

Unsere einzeilige Lösung zum Löschen der Fremdschlüsselspalte sieht also wie folgt aus:

$table->foreignId('user_id')->constrained('users')->onDelete('cascade');

1344230cookie-checkFügen Sie “ON DELETE CASCADE” zur vorhandenen Spalte in Laravel hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy