我的表中有 user_id fk 列
$table->foreign('user_id')->references('id')->on('users');
我应该将 on cascade delete 特性添加到这个现有的列中。我该怎么做?
先删除外键。感谢 Razor 的提示
$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
在我的例子中,我需要将 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');
Laravel 模式生成器无法修改当前状态的列,因此您将使用原始查询。您将不得不删除并重新创建 constraint:
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();
});
}
在当前迁移中使用无符号函数
user_id
:
$table->interger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');
从
laravel 7.0
开始,您可以使用$table->foreignId('user_id');
它是$table->unsignedBigInteger('user_id');
的别名
所以我们的外键列删除级联的oneline解决方案如下:
$table->foreignId('user_id')->constrained('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
也必须未签名。
小代码
$table->foreignId('user_id')->constrained('users');
这是创建外键关系的更好方法
$table->unsignedBigInteger('product_id');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');