У меня есть столбец user_id fk в моей таблице
$table->foreign('user_id')->references('id')->on('users');
Я должен добавить функцию каскадного удаления в этот существующий столбец. Как я могу это сделать?
Сначала мы должны отказаться от внешнего ключа. Благодаря Razor для этого наконечника
$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(); }); }
$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
также должен быть неподписанным.