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

Laravel中基于复选框选择批量插入多行数据及报错解决

Laravel多行数据插入报错:Trying to access array offset on value of type null

在Laravel中实现多行数据插入时持续抛出以下错误:

Trying to access array offset on value of type null.

现有代码

blade.php 文件

<tbody>
    @forelse($GIV as $GIV)
        <tr>
            <td> <input type="checkbox" name="status[{{$GIV->id}}]" id="status" value="Issued" ></td>
            <td> <input type="text"   class="form-control"   id="id"   name="item_id[{{$GIV->id}}]"  hidden="" value="{{$GIV->id}}">{{$GIV->id}}</td>
            <td> <input type="text"   class="form-control"   id="pr_no"          name="pr_no[{{$GIV->id}}]"          hidden="" value="{{$GIV->pr_no}}">{{$GIV->pr_no}}</td>
            <td> <input type="text"   class="form-control"   id="dep_name"       name="dep_name[{{$GIV->id}}]"       hidden="" value="{{$GIV->dep_name}}">{{$GIV->dep_name}}</td>
            <td> <input type="hidden"   class="form-control"   id="item_name"      name="item_name[{{$GIV->id}}]"    value="{{$GIV->item_name}}">{{$GIV->item_name}}</td>
            <td> <input type="text"   class="form-control"   id="description"    name="description[{{$GIV->id}}]"    hidden="" value="{{$GIV->description}}" >{{$GIV->description}}</td>
            <td> <input type="number" class="form-control"   id="item_qty"       name="item_qty[{{$GIV->id}}]"       hidden="" value="{{$GIV->item_qty}}">{{$GIV->item_qty}}</td>
            <td> <input type="text"   class="form-control"   id="unit_measure"   name="unit_measure[{{$GIV->id}}]"   hidden="" value="{{$GIV->unit_measure}}">{{$GIV->unit_measure}}</td>
            <td> <input type="number" class="form-control"   id="authorized_qty" name="authorized_qty[{{$GIV->id}}]" hidden="" value="{{$GIV->authorized_qty}}">{{$GIV->authorized_qty}}</td>
        </tr>
    @empty
        <tr><td colspan="16"><center>No Data Found</center></td></tr>
    @endforelse
</tbody>

Controller 文件

public function addDataGIV(Request $request)
{
    $data =request()->all;
    foreach(request()->status as $status) {
        DB::table('g_i_v_s')->insert(
            [
                'item_id'       =>$data['item_id'][$status],
                'item_name'     =>$data['item_name'][$status],
                'description'   =>$data['description'][$status],
                'item_qty'      =>$data['item_qty'][$status],
                'unit_measure'  =>$data['unit_measure'][$status],
                'authorized_qty'=>$data['authorized_qty'][$status],
                'dep_name'      =>$data['dep_name'][$status],
                'pr_no'         =>$data['pr_no'][$status],
            ]
        );
     }
}

问题原因

  1. request()->all 缺少括号,正确写法是 request()->all(),导致$data为null,后续访问数组偏移时触发报错。
  2. 循环request()->status时,变量$status获取的是复选框的value("Issued"),但表单字段数组的键是$GIV->id,用"Issued"作为键去访问数组必然找不到对应值。
  3. blade中多个input使用了重复的ID(如id="status"),违反DOM唯一性规则,可能引发前端潜在问题。

修复方案

修改后的Controller代码

public function addDataGIV(Request $request)
{
    // 正确获取所有请求数据
    $data = $request->all();
    
    // 循环选中的项,$id是行的ID,$status是复选框的值"Issued"
    foreach ($request->status as $id => $status) {
        // 检查对应ID的字段是否存在,避免报错
        if (!isset($data['item_id'][$id], $data['item_name'][$id])) {
            continue;
        }
        
        DB::table('g_i_v_s')->insert([
            'item_id'         => $data['item_id'][$id],
            'item_name'       => $data['item_name'][$id],
            'description'     => $data['description'][$id],
            'item_qty'        => $data['item_qty'][$id],
            'unit_measure'    => $data['unit_measure'][$id],
            'authorized_qty'  => $data['authorized_qty'][$id],
            'dep_name'        => $data['dep_name'][$id],
            'pr_no'           => $data['pr_no'][$id],
            'status'          => $status // 将复选框的值存入数据库
        ]);
    }
    
    return back()->with('success', '选中数据已成功插入');
}

修改后的blade.php关键部分

主要修复重复ID及变量名冲突问题:

<tbody>
    @forelse($GIV as $givItem)
        <tr>
            <td> <input type="checkbox" name="status[{{$givItem->id}}]" id="status-{{$givItem->id}}" value="Issued" ></td>
            <td> <input type="text" class="form-control" id="id-{{$givItem->id}}" name="item_id[{{$givItem->id}}]" hidden="" value="{{$givItem->id}}">{{$givItem->id}}</td>
            <td> <input type="text" class="form-control" id="pr_no-{{$givItem->id}}" name="pr_no[{{$givItem->id}}]" hidden="" value="{{$givItem->pr_no}}">{{$givItem->pr_no}}</td>
            <td> <input type="text" class="form-control" id="dep_name-{{$givItem->id}}" name="dep_name[{{$givItem->id}}]" hidden="" value="{{$givItem->dep_name}}">{{$givItem->dep_name}}</td>
            <td> <input type="hidden" class="form-control" id="item_name-{{$givItem->id}}" name="item_name[{{$givItem->id}}]" value="{{$givItem->item_name}}">{{$givItem->item_name}}</td>
            <td> <input type="text" class="form-control" id="description-{{$givItem->id}}" name="description[{{$givItem->id}}]" hidden="" value="{{$givItem->description}}" >{{$givItem->description}}</td>
            <td> <input type="number" class="form-control" id="item_qty-{{$givItem->id}}" name="item_qty[{{$givItem->id}}]" hidden="" value="{{$givItem->item_qty}}">{{$givItem->item_qty}}</td>
            <td> <input type="text" class="form-control" id="unit_measure-{{$givItem->id}}" name="unit_measure[{{$givItem->id}}]" hidden="" value="{{$givItem->unit_measure}}">{{$givItem->unit_measure}}</td>
            <td> <input type="number" class="form-control" id="authorized_qty-{{$givItem->id}}" name="authorized_qty[{{$givItem->id}}]" hidden="" value="{{$givItem->authorized_qty}}">{{$givItem->authorized_qty}}</td>
        </tr>
    @empty
        <tr><td colspan="9"><center>No Data Found</center></td></tr>
    @endforelse
</tbody>

注:将循环变量从$GIV改为$givItem避免变量名冲突,同时修正空状态下的colspan值(原16与实际列数9不符)。

效果说明

修复后,用户勾选复选框提交时,仅会将选中行的数据(包括复选框的"status"值)插入数据库,且不会再触发原报错。

内容的提问来源于stack exchange,提问作者Nardos Mesfin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:45:28