Laravel 成功在一对多关系模型中添加项目,但未将其添加到数据库

问题描述 投票:0回答:1

请帮忙,从那时起我就被困在这里了。 我想使用更新方法从shipmentrequest模型中插入shipmentrequestitem

public function update(UpdateShipmentRequestRequest $request, $id)
{
    $shipmentRequest = ShipmentRequest::with(
        'shipmentRequestItems',
        )->where('id',$id)->first();
    $shipmentRequest->update($request->all());
    $validatedData = $request->validated();
    $shipmentRequestItems = $validatedData['shipmentRequestItems'];
    // $shipmentRequest = ShipmentRequest::find($id);
    
    $existingItems = [];
    foreach ($shipmentRequestItems as $value) {
        DB::beginTransaction();
        if (is_array($value)) {
            $shipmentRequestItem = new ShipmentRequestItem;
            $shipmentRequestItem->name = $value["name"];
            $shipmentRequestItem->quantity = $value["quantity"];
            $shipmentRequestItem->shipment_request_id = $shipmentRequest->id;
    
            // Save the ShipmentRequestItem to the database
            $shipmentRequestItem->save();
            $shipmentRequest->shipmentRequestItems()->create(['name' => $value['name'], 'quantity'=> $value['quantity']]);
            $shipmentRequest->shipmentRequestItems()->save($shipmentRequestItem);
            echo json_encode($shipmentRequest);
            echo json_encode($shipmentRequestItem);
        } else {
            $existingItems[] = $value;
        }
    }
    
    $shipmentRequest->shipmentRequestItems()->whereNotIn('id', $existingItems)->delete();
    $shipmentRequest->refresh();
    return new ShipmentRequestResource($shipmentRequest);
}

当我尝试输出 $shipmentRequest->shipmentRequestItems() 时,它已成功添加,但未添加回数据库表。它还增加了 id,所以我想知道是什么原因导致的。

这是我的迁移 I'm not sure if this is the correct way though

这是我的模型 I tried mapping the correct column to specify it

我已经尝试使用不同的方法插入,但总是有相同的结果。它没有添加到数据库

angular laravel orm laravel-8 eloquent-relationship
1个回答
0
投票

这里的问题是,您正在启动事务,并且正在对模型进行更改,但没有将它们提交到数据库中。

为了将这些更改提交到数据库,您需要调用

commit()
外观上的
DB
方法,如下所示:

public function update(UpdateShipmentRequestRequest $request, $id)
{
    $shipmentRequest = ShipmentRequest::with(
        'shipmentRequestItems',
        )->where('id',$id)->first();
    $shipmentRequest->update($request->all());
    $validatedData = $request->validated();
    $shipmentRequestItems = $validatedData['shipmentRequestItems'];
    // $shipmentRequest = ShipmentRequest::find($id);
    
    $existingItems = [];
    foreach ($shipmentRequestItems as $value) {
        DB::beginTransaction();
        if (is_array($value)) {
            $shipmentRequestItem = new ShipmentRequestItem;
            $shipmentRequestItem->name = $value["name"];
            $shipmentRequestItem->quantity = $value["quantity"];
            $shipmentRequestItem->shipment_request_id = $shipmentRequest->id;
    
            // Save the ShipmentRequestItem to the database
            $shipmentRequestItem->save();
            $shipmentRequest->shipmentRequestItems()->create(['name' => $value['name'], 'quantity'=> $value['quantity']]);
            $shipmentRequest->shipmentRequestItems()->save($shipmentRequestItem);
            echo json_encode($shipmentRequest);
            echo json_encode($shipmentRequestItem);
        } else {
            $existingItems[] = $value;
        }
        DB::commit(); // <-- ADD THIS LINE
    }
    
    $shipmentRequest->shipmentRequestItems()->whereNotIn('id', $existingItems)->delete();
    $shipmentRequest->refresh();
    return new ShipmentRequestResource($shipmentRequest);
}

但是,由于您同时在多个相关表中进行插入,因此我建议您将所有数据库操作操作放在事务中,例如:

public function update(UpdateShipmentRequestRequest $request, $id)
{
    DB::beginTransaction(); // START THE TRANSACTION
    $shipmentRequest = ShipmentRequest::with(
        'shipmentRequestItems',
        )->where('id',$id)->first();
    $shipmentRequest->update($request->all());
    $validatedData = $request->validated();
    $shipmentRequestItems = $validatedData['shipmentRequestItems'];
    // $shipmentRequest = ShipmentRequest::find($id);
    
    $existingItems = [];

    foreach ($shipmentRequestItems as $value) {
        if (is_array($value)) {
            $shipmentRequestItem = new ShipmentRequestItem;
            $shipmentRequestItem->name = $value["name"];
            $shipmentRequestItem->quantity = $value["quantity"];
            $shipmentRequestItem->shipment_request_id = $shipmentRequest->id;
    
            // Save the ShipmentRequestItem to the database
            $shipmentRequestItem->save();
            $shipmentRequest->shipmentRequestItems()->create(['name' => $value['name'], 'quantity'=> $value['quantity']]);
            $shipmentRequest->shipmentRequestItems()->save($shipmentRequestItem);
            echo json_encode($shipmentRequest);
            echo json_encode($shipmentRequestItem);
        } else {
            $existingItems[] = $value;
        }
    }
    
    $shipmentRequest->shipmentRequestItems()->whereNotIn('id', $existingItems)->delete();
    DB::commit(); // END THE TRANSACTION AND COMMIT CHANGES
    $shipmentRequest->refresh();
    return new ShipmentRequestResource($shipmentRequest);
}

这样,如果某个操作未能保存到数据库,所有更改都将回滚,从而保持数据库内数据的一致性

© www.soinside.com 2019 - 2024. All rights reserved.