使用PHP for loop实现库存结余结转至下一条记录及问题排查
问题根因
你当前代码的循环逻辑完全错误,是触发异常的核心原因:
- 你的for循环设定
$i从0到12,合计执行13次循环,每次给库存结余累加当前的$i值,累计要加的总数值为0+1+2+...+12 = 78 - 第一条库存记录最多只能容纳10,剩余的78-10=68自然就全部累加到下一条符合条件的记录上,和你遇到的异常表现完全吻合
正确实现方案
核心逻辑是维护剩余待分配的库存数量,循环处理可用库存记录,直到待分配数量清零即可:
$enteredQty = 12; $remainingQty = $enteredQty; // 只要还有待分配的库存就持续处理 while ($remainingQty > 0) { // 查询下一条未饱和的可用库存记录 $paper_stock = paper_stock::where('paper_id', $pid) ->where('status', 0) ->whereRaw('balance < qty') ->first(); // 无可用库存时直接终止,避免死循环 if (empty($paper_stock)) { break; } // 计算当前记录最多可新增的库存额度 $maxAdd = $paper_stock->qty - $paper_stock->balance; // 本次实际分配的数量取剩余待分配量和最大可加量的较小值 $actualAdd = min($remainingQty, $maxAdd); // 更新当前记录结余 $paper_stock->balance += $actualAdd; $paper_stock->save(); // 当前记录满额后更新状态 if ($paper_stock->balance == $paper_stock->qty) { $paper_stock->status = 1; $paper_stock->save(); } // 扣减剩余待分配的数量 $remainingQty -= $actualAdd; }
内容的提问来源于stack exchange,提问作者Madushan Serasinghe
相关产品推荐
相关产品推荐

