Добавить "on DELETE CASCADE" в существующую колонку в Laravel
У меня есть столбец user_id fk в моей таблице
$table->foreign('user_id')->references('id')->on('users');
Мне нужно добавить на каскадное удаление функция для этого существующего столбца. Как я могу это сделать?
7 ответов
сначала мы должны удалить внешний ключ. Спасибо бритвы за этот совет
$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Laravel schema builder не может изменять столбцы в текущем состоянии, поэтому вы будете использовать необработанные запросы. Вам придется отбросить и воссоздать ограничения:
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);'
);
}
Спасибо за ответ на вопрос. Помогите мне добраться до этого рабочего кода в 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->integer('user_id')->unsigned();
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Я предполагаю, что вы использовали Illuminate\Database\Schema\Blueprint::primary()
создать users.id
. Если это так, то users.id
будет беззнаковым. Поэтому ваш столбец внешнего ключа user_id
также должно быть без знака.
ответ Фарида Мовсумова сработал для меня. Вы должны проверить "answers_user_id_foreign" в структуре MySQL. Ниже в phpmyadmin находится таблица под названием indexes, где вы найдете свой эквивалент
в моем случае мне нужно будет поместить имя col в массив, иначе это будет ошибкой.
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