You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:10:28