Ajouter" ON DELETE CASCADE " à la colonne existante de Laravel

j'ai la colonne user_id fk dans ma table

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

je devrais ajouter sur supprimer en cascade fonction de cette colonne existante. Comment puis-je faire cela?

21
demandé sur Farid Movsumov 2014-11-08 21:49:34

7 réponses

nous devrions d'abord laisser tomber la clé étrangère. Grâce à Rasoir pour cette astuce

$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
38
répondu Farid Movsumov 2017-05-23 12:02:40

Laravel schema builder ne peut pas modifier les colonnes à l'état actuel, donc vous utiliserez des requêtes brutes. Vous devrez laisser tomber et recréer le contrainte:

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
répondu Razor 2014-11-08 23:55:25
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
2
répondu Mark Baker 2014-11-08 18:53:51

Merci pour la réponse aux questions. Aide-moi à trouver ce code de travail en L5.1:

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
répondu JohnWolf 2015-10-16 17:24:06
$table->integer('user_id')->unsigned();    
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

je suppose que vous avez utilisé Illuminate\Database\Schema\Blueprint::primary() pour créer users.id. Si c'est le cas, alors users.id ne seront pas signés. Par conséquent, votre colonne de clé étrangère user_id doit aussi être non signé.

0
répondu Inda5th 2014-11-09 02:17:03

la réponse de Farid Movsumov a fonctionné pour moi. Vous devez vérifier "answers_user_id_foreign" dans la structure MySQL. En bas, dans phpmyadmin est une table appelée index où vous trouverez votre équivalent

0
répondu Sallmin Rexha 2018-08-10 07:34:39

dans mon cas, je vais avoir besoin de mettre le nom de col dans un tableau qui sera une erreur.

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

0
répondu shalonteoh 2018-09-28 08:55:29