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(); }
额外检查项
- 确认
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(); }
- 查看Laravel日志文件
storage/logs/laravel.log,获取500错误的具体堆栈信息,排查是否存在商品模型字段错误、权限问题等隐藏问题。
内容的提问来源于stack exchange,提问作者Mehdi Bakhtiari
相关产品推荐
相关产品推荐

