web-dev-qa-db-fra.com

Ajouter "ON DELETE CASCADE" à une colonne existante dans Laravel

J'ai la colonne user_id fk dans ma table

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

Je devrais ajouter en cascade, delete feature à cette colonne existante. Comment puis-je faire ceci?

24
Farid Movsumov

Déposez la clé étrangère en premier. Merci à Razor pour ce conseil

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

Le constructeur de schéma Laravel ne peut pas modifier les colonnes à l'état actuel, vous allez donc utiliser des requêtes brutes. Vous devrez supprimer et recréer la 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
Razor

Dans mon cas, je devrai mettre le nom du col dans un tableau, sinon ce 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

2
shalonteoh

Merci pour la réponse à la question. Aidez-moi à obtenir ce code de travail dans 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
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');

Je suppose que vous avez utilisé Illuminate\Database\Schema\Blueprint::primary() pour créer users.id. Si tel est le cas, alors users.id sera non signé. Par conséquent, votre colonne de clé étrangère user_id doit également être non signée.

0
Inda5th

La réponse de Farid Movsumov a fonctionné pour moi. Vous devriez 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
Sallmin Rexha

Utilisez la fonction unsigned to user_id dans la migration actuelle:

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