在子表 Laravel 中插入数据时出现外键问题

Posted

技术标签:

【中文标题】在子表 Laravel 中插入数据时出现外键问题【英文标题】:Foreign key issue while inserting data in child table Laravel 【发布时间】:2020-07-03 08:54:57 【问题描述】:

我正在尝试在 orders 表中插入数据,然后将订单详细信息保存在 order_details 表中。以下是我正在尝试的代码

$order = Order::create($request->all());
$order->order_detail()->insert($request->order_detail); //$request->order_detail is an array

在我的模型中,我提供了关系

订单模式

public function order_detail()
   return $this->hasMany(OrderDetail::class, 'order_id');

订单明细模型

public function order()
   return $this->belongsTo(Order::class,'order_id');

但它返回我 一般错误:1364 字段“order_id”没有默认值,因为 order_id 是 order_details 表中的外键

不手动提供order_id怎么办

【问题讨论】:

你在dd($request->order_detail)时看到了什么? @Digvijay array:2 [ 0 => array:4 [ "product_id" => 32 "qty" => 4 "price" => "470.00" "details" => "Recusandae voluptas earum " ] 1 => array:4 [ "product_id" => 32 "qty" => 4 "price" => "470.00" "details" => "Recusandae voluptas earum praesentium esse iure dignissimos。Deleniti rerum voluptatem debitis et non et。 Dolorem reiciendis quia qui et omnis aut。” ] ] 【参考方案1】:

我将假设$request->order_detail 是许多order_details 的数组。

insert 的问题在于你使用的不是 Eloquent,而是查询构建器,因此 Laravel 无法自行填充 order_id,如果你使用 createMany,它将能够这样做:

$order = Order::create($request->all());
$order->order_detail()->createMany($request->order_detail);

来自docs:

您可以使用 createMany 方法创建多个相关模型:

$post = App\Post::find(1);

$post->comments()->createMany([
    [
        'message' => 'A new comment.',
    ],
    [
        'message' => 'Another new comment.',
    ],
]);

【讨论】:

非常感谢,这就是我要找的东西【参考方案2】:

因为您的 $request->order_detail 不会包含 order_id。您可以从新创建的 $order 中获取它。

$order = Order::create($request->all()); // upon create, you can access the order_id by doing $order->id

$orderDetails = [];

foreach($request->order_detail as $details) 
    $orderDetails[] = [
        array_merge($details, ['order_id' => $order->id]);
    ];


$order->order_detail()->insert($orderDetails);

【讨论】:

Laravel 有什么方法可以自己获取 order_it 吗?【参考方案3】:

听起来像是数据库问题。 order_id 列有 AUTO_INCREMENT,这意味着它会在插入时生成一个数字。

尝试使用 phpMyAdmin 插入以查看 AUTO_INCREMENT 是否有效。或者使用 SHOW TABLE STATUS 并检查 AUTO_INCREMENT。

【讨论】:

不,它不是自动增量。 order_id 未分配

以上是关于在子表 Laravel 中插入数据时出现外键问题的主要内容,如果未能解决你的问题,请参考以下文章

有外键约束的子表插入数据时出现的错误

在 Hibernate 中,如何自动检索父 id 并在子插入中将其用作外键?

保存产品时出现外键约束错误

使用带有 Hibernate 的 JPA 注释来描述外键仅在子表中的 @OneToMany 关系

spring boot jpa中的多对一映射中的外键未在子表中更新

如何在继承类postgresql上实现外键