在子表 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 关系