请帮忙,从那时起我就被困在这里了。 我想使用更新方法从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,所以我想知道是什么原因导致的。
我已经尝试使用不同的方法插入,但总是有相同的结果。它没有添加到数据库
这里的问题是,您正在启动事务,并且正在对模型进行更改,但没有将它们提交到数据库中。
为了将这些更改提交到数据库,您需要调用
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);
}
这样,如果某个操作未能保存到数据库,所有更改都将回滚,从而保持数据库内数据的一致性。