调用foreignIdFor()时Laravel添加约束条件“1”外键

zynd9foi  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(174)

我尝试用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

zwghvu4y

zwghvu4y1#

外键约束条件名称中的1实际上是Laravel的foreignIdFor()方法的默认行为。它通过用下划线连接表名和列名来自动生成外键约束条件的名称。在本例中,由于表为orders,列为customer_id,因此它生成orders_1作为约束条件名称。
要更改此行为并使用您自己的自定义约束名称,可以将其作为参数传递给constrained()方法:

Schema::create('orders', function (Blueprint $table) {
    $table->id();
    $table->foreignIdFor(Customer::class)->constrained('customers_id_foreign')->index();
    $table->timestamps();
});

这将创建一个名为customers_id_foreign的外键约束,而不是默认的orders_1

bqjvbblv

bqjvbblv2#

之所以在外键约束名中看到"1"而不是"customer_id",是因为Laravel的迁移语法发生了变化。在Laravel 8中,foreignIdFor方法使用从1开始的数字索引自动生成外键约束名。
如果要指定自定义外键约束条件名称,可以将其作为参数传递给constrained方法。例如:

$table->foreignIdFor('customer_id')->constrained('customers', 'fk_orders_customers')->index();

这将生成以下SQL:

alter table `orders` add constraint `fk_orders_customers` foreign key (`customer_id`) references `customers` (`id`)

或者,您可以使用您提到的传统外键语法:

$table->unsignedBigInteger('customer_id')->index();
$table->foreign('customer_id')->references('id')->on('customers');

相关问题