Add order Laravel

Viewed 80

I am adding order to database. It works like this: When ordering is clicked, the order is created in the Order table, at the same time the product items are also added to the OrderItem table, via the order_id foreign key. But I don't know how to get the order_id, because it is added at the same time, and the Order id is increments.

public function save(array $data, int $id = null){
    $idCurrent = Auth::id(); 
    $orderItems = $data['orderItems'];

    //add to Order
    Order::updateOrCreate(
        [
            'id' => $id
        ],
        [
            'user_id' => $idCurrent,
            'shipping_fee' => $data['shipping_fee'],
            'total' => $data['total'],
            'payment' => $data['payment'],
            'status_id' => 1,
        ]
    );

    //add to OrderItem
    foreach($orderItems as $item){
        OrderItem::Create([
            'order_id' => 222,   //=> ?????????????
            'product_id' => $item -> product_id,
            'quantity' => $item->quantity,
        ]);
    }
    return true;
}
2 Answers
 $order = Order::updateOrCreate(
    [
        'id' => $id
    ],
    [
        'user_id' => $idCurrent,
        'shipping_fee' => $data['shipping_fee'],
        'total' => $data['total'],
        'payment' => $data['payment'],
        'status_id' => 1,
    ]
);

//add to OrderItem
foreach($orderItems as $item){
    OrderItem::Create([
        'order_id' =>$order->id
        'product_id' => $item -> product_id,
        'quantity' => $item->quantity,
    ]);
}
return true;

Avoid multiple call to databases.

When you create order with

$order = Order::updateOrCreate(
    [
        'id' => $id
    ],
    [
        'user_id' => $idCurrent,
        'shipping_fee' => $data['shipping_fee'],
        'total' => $data['total'],
        'payment' => $data['payment'],
        'status_id' => 1,
    ]
);

next you should is to send just one request to database with

// create batch array
$insertOrderItems = [];
foreach($orderItems as $item){
    $insertOrderItems[] = [
        'product_id' => $item->product_id,
        'quantity' => $item->quantity,
    ]; 
}
// insert all at once in batch mode making just one call to database
$order->orderItems()->create($insertOrderItems);

Presuming you have sorted relations in Order and OrderItem models.

Related