PHP数组偏移访问报错与批量库存更新异常求助
解决「Trying to access array offset on value of type int」错误及批量库存更新失效问题
问题现象
- 批量库存调整时,循环内
$qty[$key]和$action[$key]可正常调用,但$batch_id[$key]抛出「Trying to access array offset on value of type int」错误 - 数据库仅第一条数据的库存被更新,第二条数据无变化
- 执行
isset($batch_id[$key])返回true,尝试将$batch_id[$key]赋值给临时变量也无法解决问题
调试信息与代码
提交的请求数据$data
array:12 [▼ // app/Http/Controllers/AdjustmentController.php:201 "_token" => "TWFJuqmjro2Jdhovo28vAw0pjePLfEHp2bI0gcm1" "warehouse_id" => "2" "stock_count_id" => "46" "qty" => array:2 [▼ 0 => "1" 1 => "3" ] "action" => array:2 [▼ 0 => "+" 1 => "-" ] "product_id" => array:2 [▼ 0 => "114" 1 => "114" ] "product_code" => array:2 [▼ 0 => "36089125" 1 => "36089125" ] "batch_id" => array:2 [▼ 0 => "761" 1 => "762" ] "total_qty" => "4" "item" => "2" "note" => null "reference_no" => "adr-20231210-082622" ]
视图代码(批量条目渲染)
@foreach($names as $key=>$name) <tr> <td>{{$name}}</td> <td>{{$code[$key]}}</td> <td>{{$batch_id[$key]}}</td> <td><input type="number" class="form-control qty" name="qty[]" value="{{$qty[$key]}}" required step="any" /></td> <td class="action"> <select name="action[]" class="form-control act-val"> @if($action[$key] == '+') <option value="+">{{trans("file.Addition")}}</option> <option value="-">{{trans("file.Subtraction")}}</option> @else <option value="-">{{trans("file.Subtraction")}}</option> <option value="+">{{trans("file.Addition")}}</option> @endif </select> </td> <td> <button type="button" class="ibtnDel btn btn-md btn-danger">{{trans("file.delete")}}</button> <input type="hidden" class="product-id" name="product_id[]" value="{{$product_id[$key]}}" /> <input type="hidden" class="product-code" name="product_code[]" value="{{$code[$key]}}" /> <input type="hidden" class="batch_id" name="batch_id[]" value="{{$batch_id[$key]}}"/> </td> </tr> @endforeach
原控制器代码(存在问题的版本)
public function store(Request $request) { $data = $request->except('document'); $product_id = $data['product_id']; $product_code = $data['product_code']; $batch_id= $data['batch_id']; $qty = $data['qty']; $action = $data['action']; foreach ($product_id as $key => $pro_id) { $lims_product_data = Product::find($pro_id); $myBatch=$batch_id[$key] ; $lims_product_warehouse_data = Product_Warehouse::where([ ['product_id', $pro_id], ['product_batch_id', $myBatch], ['warehouse_id', $data['warehouse_id'] ], ])->first(); $lims_product_batch_data = ProductBatch::select('id', 'batch_no', 'qty', 'expired_date')->where('id',$myBatch)->first(); if($action[$key] == '-'){ $lims_product_batch_data->qty -= $qty[$key]; $lims_product_data->qty -= $qty[$key]; $lims_product_warehouse_data->qty -= $qty[$key]; } elseif($action[$key] == '+'){ $lims_product_batch_data->qty += $qty[$key]; $lims_product_data->qty += $qty[$key]; $lims_product_warehouse_data->qty += $qty[$key]; } $lims_product_batch_data->save(); $lims_product_data->save(); $lims_product_warehouse_data->save(); $batch_id = $lims_product_batch_data->id; // 问题根源所在 } return redirect('qty_adjustment')->with('message', 'Data inserted successfully'); }
问题根源分析
循环内的$batch_id = $lims_product_batch_data->id;语句是核心错误:
- 初始化时
$batch_id是存储所有批次ID的数组 - 第一次循环执行到该语句时,
$batch_id被覆盖为当前批次的整型ID值 - 第二次循环尝试访问
$batch_id[$key]时,$batch_id已经是整型而非数组,因此触发「Trying to access array offset on value of type int」错误,导致第二条数据的处理逻辑中断,库存未更新
解决方案
修改循环内的变量名,避免覆盖原数组变量。如果该赋值后的变量后续没有使用场景,甚至可以直接删除该语句:
修改后的控制器代码
public function store(Request $request) { $data = $request->except('document'); $product_id = $data['product_id']; $product_code = $data['product_code']; $batch_ids= $data['batch_id']; // 重命名变量更清晰,避免混淆 $qty = $data['qty']; $action = $data['action']; foreach ($product_id as $key => $pro_id) { $lims_product_data = Product::find($pro_id); $myBatch = $batch_ids[$key]; // 使用新变量名 $lims_product_warehouse_data = Product_Warehouse::where([ ['product_id', $pro_id], ['product_batch_id', $myBatch], ['warehouse_id', $data['warehouse_id'] ], ])->first(); $lims_product_batch_data = ProductBatch::select('id', 'batch_no', 'qty', 'expired_date')->where('id',$myBatch)->first(); if($action[$key] == '-'){ $lims_product_batch_data->qty -= $qty[$key]; $lims_product_data->qty -= $qty[$key]; $lims_product_warehouse_data->qty -= $qty[$key]; } elseif($action[$key] == '+'){ $lims_product_batch_data->qty += $qty[$key]; $lims_product_data->qty += $qty[$key]; $lims_product_warehouse_data->qty += $qty[$key]; } $lims_product_batch_data->save(); $lims_product_data->save(); $lims_product_warehouse_data->save(); // 若后续无需使用该值,直接删除原赋值语句;若需要则改为: // $updated_batch_id = $lims_product_batch_data->id; } return redirect('qty_adjustment')->with('message', 'Data inserted successfully'); }
额外优化建议
- 变量命名尽量语义化,比如将原
$batch_id数组重命名为$batch_ids,避免与单个批次ID变量混淆 - 添加空值判断,比如检查
$lims_product_batch_data和$lims_product_warehouse_data是否存在,避免后续调用->qty时出现空对象错误
内容的提问来源于stack exchange,提问作者Hagar Maher
相关产品推荐
相关产品推荐

