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], ] ); } }
问题原因
request()->all缺少括号,正确写法是request()->all(),导致$data为null,后续访问数组偏移时触发报错。- 循环
request()->status时,变量$status获取的是复选框的value("Issued"),但表单字段数组的键是$GIV->id,用"Issued"作为键去访问数组必然找不到对应值。 - 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
相关产品推荐
相关产品推荐

