猿问

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

我正在尝试在订单表中插入数据,然后将订单详细信息保存在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 的情况下做到这一点


Helenr
浏览 142回答 3
3回答

吃鸡游戏

我假设这$request->order_detail是一个由许多 组成的数组order_details。问题insert是您没有使用 Eloquent,而是使用查询生成器,因此 Laravel 无法自行填充order_id,如果您使用createMany它,它将能够这样做:$order = Order::create($request->all());$order->order_detail()->createMany($request->order_detail);来自文档:您可以使用 createMany 方法创建多个相关模型:$post = App\Post::find(1);$post->comments()->createMany([    [        'message' => 'A new comment.',    ],    [        'message' => 'Another new comment.',    ],]);

一只名叫tom的猫

因为你的$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);

侃侃尔雅

听起来像是数据库问题。该列order_id具有 AUTO_INCRMENT,这意味着它将在插入时生成一个数字。尝试使用 phpMyAdmin 插入以查看 AUTO_INCRMENT 是否有效。或者使用 SHOW TABLE STATUS 并检查 AUTO_INCRMENT。
随时随地看视频慕课网APP
我要回答