Добавить & quot; НА УДАЛЕННОМ КАСКАДЕ & quot; к существующей колонке в Laravel

В моей таблице есть столбец user_id fk

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

Я должен добавить на каскадном удалении особенность этого существующего столбца. Как я могу это сделать?

24

Решение

Сначала удалите внешний ключ. Благодаря бритва за этот совет

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

Другие решения

Компоновщик схемы 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);'
);
}
4

Спасибо за ответ на вопрос. Помогите мне получить этот рабочий код в 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

В моем случае мне нужно будет поместить имя 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 вер

2
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
1
$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 также должен быть без знака.

0

Ответ Фарида Мовсумова сработал для меня. Вы должны проверить «answers_user_id_foreign» в структуре MySQL. Внизу в phpmyadmin находится таблица indexes, где вы найдете свой эквивалент

0

Используйте функцию без знака для user_id в современной миграции:

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