Laravel表单提交返回404,仅刷新后数据才保存
问题原因及解决方案
核心问题:未实例化$order变量导致请求中断
你的update方法里,获取了$order_id = $orderDetail->order_id;,但直接调用$order->subtotal时,$order变量根本没定义也没从数据库获取实例,这会触发致命错误,导致请求异常终止(服务器可能返回404或500,取决于错误配置)。但因为$orderDetail->update($request->all());在错误发生前已经执行,所以数据库里的订单明细已经更新,刷新页面后就能看到修改后的结果。
修正后的控制器代码
public function update(UpdateOrderDetailRequest $request, OrderDetail $orderDetail) { // 先计算新的明细金额 $item_id = $request->input('order_item_id'); $item = Product::findOrFail($item_id); $new_amount = $item->price * $request['quantity']; // 获取明细更新前的旧金额,用于修正订单小计 $old_amount = $orderDetail->getOriginal('amount'); // 统一更新订单明细,避免两次数据库操作 $orderDetail->update(array_merge($request->all(), ['amount' => $new_amount])); // 实例化订单对象并修正小计 $order = Order::findOrFail($orderDetail->order_id); $updated_subtotal = $order->subtotal - $old_amount + $new_amount; $order->update(['subtotal' => $updated_subtotal]); return redirect()->action([HomeController::class, 'index']); }
额外注意点
- 订单小计计算逻辑修正:原代码直接用
旧小计+新金额会重复累加,正确逻辑是用订单原有小计减去该明细的旧金额,再加新金额,避免每次编辑都让订单小计异常增长。 - 减少数据库交互:把两次
$orderDetail->update()合并成一次,提升性能。 - 路由校验:确认
admin.order-details.update路由正确指向该控制器的update方法,排除路由配置错误导致的404。
内容的提问来源于stack exchange,提问作者Hagar Maher
相关产品推荐
相关产品推荐

