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?
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');
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);'
);
}
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
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();
});
}
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
$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.
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
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');