Laravel 8库存更新问题:仅名称可更新,商品数量失效且报空对象错误
问题分析与修复
报错翻译
「从空值创建默认对象」
核心问题
你的stockUpdate方法里有几个明显的错误:
- 变量名不匹配:你用
$stockitemitems接收查询结果,但后面直接用未定义的$stockitems去赋值,这直接触发了「空值创建对象」的报错。 - 查询逻辑错误:
DB::table(...)->get()返回的是数据集合,不是单个模型实例,就算变量名正确,也没法直接调用update();而且你没按当前循环的product_id筛选,相当于拿了当前库存下所有商品记录,根本对应不上要更新的目标商品。 - 缺失无记录时的处理:如果新增了商品,更新时可能找不到对应的
StockItems记录,需要和stockAdd逻辑对齐,创建新记录。
修复后的代码
public function stockUpdate(Request $request, $id) { $validator = validator(request()->all(), ['stock_name' => 'required']); if($validator->fails()) { return back()->withErrors($validator); } $stock = Stocks::findOrFail($id); $stock->stock_name = request()->stock_name; $stock->my_stock = 0; $stock->disable = 0; $stock->save(); // findOrFail拿到的模型用save语义更清晰,和update效果一致 $user_id = Auth::user()->user_id; // 用关联查询减少循环嵌套和数据库请求 $brands = Brands::with('products')->get(); foreach ($brands as $brand){ foreach ($brand->products as $product){ $product_id = $product->product_id; // 精准查询当前库存、当前用户、当前商品的记录 $stockItem = StockItems::where('stock_id', $stock->stock_id) ->where('owner_id', $user_id) ->where('product_id', $product->product_id) ->first(); // 无记录则创建新实例,和添加逻辑对齐 if(!$stockItem) { $stockItem = new StockItems(); $stockItem->stock_id = $stock->stock_id; $stockItem->product_id = $product->product_id; $stockItem->owner_id = $user_id; } // 用默认值简化数量判断 $stockItem->count = $request->input($product_id, 0); $stockItem->save(); } } return redirect(route('user.stock-list'))->with('successAddMsg','更新成功'); }
额外优化建议
- 表单验证可以给商品数量字段加规则:
array|nullable+ 单个字段的integer|min:0,避免非法值入库。 - 随机生成
stock_id可以改用UUID,比如Str::uuid()(需引入use Illuminate\Support\Str;),彻底避免重复风险。 - 可以把库存商品的添加/更新逻辑抽成单独的方法,减少代码冗余。
内容的提问来源于stack exchange,提问作者Win Mint Thu
相关产品推荐
相关产品推荐

