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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:17:33