我尝试用Laravel最新的迁移语法添加一个外键约束。
在本例中,我有一个Order
模型,我试图将它连接到一个Customer
模型。
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->string('email');
$table->string('first_name');
$table->string('last_name');
$table->timestamps();
});
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->foreignIdFor(Customer::class)->constrained()->index();
$table->timestamps();
});
我希望执行以下SQL:
alter table `orders` add constraint `customer_id` foreign key (`customer_id`) references `customers` (`id`)
但是,Laravel正在执行以下查询:
alter table `orders` add constraint `1` foreign key (`customer_id`) references `customers` (`id`)
我已经看了www.example.com上的文档laravel.com,引用方法的代码功能和我给出的示例似乎符合我对代码行为的期望。
以下语法有效:
$table->unsignedBigInteger('customer_id')->index();
$table->foreign('customer_id')->references('id')->on('customers');
为什么我得到的是1
而不是customer_id
?
2条答案
按热度按时间zwghvu4y1#
外键约束条件名称中的
1
实际上是Laravel的foreignIdFor()
方法的默认行为。它通过用下划线连接表名和列名来自动生成外键约束条件的名称。在本例中,由于表为orders
,列为customer_id
,因此它生成orders_1
作为约束条件名称。要更改此行为并使用您自己的自定义约束名称,可以将其作为参数传递给
constrained()
方法:这将创建一个名为
customers_id_foreign
的外键约束,而不是默认的orders_1
。bqjvbblv2#
之所以在外键约束名中看到
"1"
而不是"customer_id"
,是因为Laravel的迁移语法发生了变化。在Laravel 8中,foreignIdFor
方法使用从1开始的数字索引自动生成外键约束名。如果要指定自定义外键约束条件名称,可以将其作为参数传递给
constrained
方法。例如:这将生成以下SQL:
或者,您可以使用您提到的传统外键语法: