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

Laravel删除单据时商品数量未递减的问题修复求助

解决删除单据时库存未递减且报500错误的问题

问题根源分析

  • 拼写错误:库存操作方法中使用了错误的参数munis,正确应为minus,这会导致total_quantity方法无法匹配到对应的递减逻辑,触发服务器错误。
  • 执行顺序错误:当前代码先删除了单据,再处理关联商品记录,且未先遍历商品记录执行库存递减就直接删除BillProduct数据,导致无法获取商品数量来调整库存。
  • 批量删除无数据交互:BillProduct::where('bill_id', '=', $bill->id)->delete()是批量删除操作,无法拿到每条商品的数量和ID,也就无法调用库存递减方法。

修正后的Destroy控制器代码

if ($bill->created_by == \Auth::user()->creatorId()) {
    // 先获取该单据下的所有关联商品记录
    $billProducts = BillProduct::where('bill_id', '=', $bill->id)->get();
    
    // 遍历商品记录,执行库存递减(修正拼写错误:munis → minus)
    foreach ($billProducts as $billProduct) {
        Utility::total_quantity('minus', $billProduct->quantity, $billProduct->product_id);
    }
    
    // 保留原供应商余额处理逻辑
    if ($bill->vender_id != 0) {
        Utility::userBalance('vendor', $bill->vender_id, $bill->getTotal(), 'debit');
    }
    
    // 删除关联商品记录
    BillProduct::where('bill_id', '=', $bill->id)->delete();
    
    // 最后删除单据本身
    $bill->delete();
}

额外检查项

  1. 确认Utility::total_quantity方法中minus分支逻辑正确,示例参考:
public static function total_quantity($type, $quantity, $productId)
{
    $product = Product::find($productId);
    if (!$product) {
        // 处理商品不存在的异常,避免报错
        return;
    }
    
    if ($type == 'plus') {
        $product->total_quantity += $quantity;
    } elseif ($type == 'minus') {
        // 可选:防止库存减为负数,根据业务需求调整
        if ($product->total_quantity >= $quantity) {
            $product->total_quantity -= $quantity;
        } else {
            throw new \Exception('库存数量不足,无法执行递减操作');
        }
    }
    
    $product->save();
}
  1. 查看Laravel日志文件storage/logs/laravel.log,获取500错误的具体堆栈信息,排查是否存在商品模型字段错误、权限问题等隐藏问题。

内容的提问来源于stack exchange,提问作者Mehdi Bakhtiari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:12:24