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