Laravel如何将前端提交的多行表格数据正确存入数据库
核心问题:如何上传表格数据才能被正确保存?
在视图层搭建了一张包含多列的多行表格,通过foreach循环可正常填充渲染所有行。在控制器中使用$input = $request->all();接收提交数据时,得到的是按字段分组的数组而非按行组织的规整结构,无法成功将数据存入数据库,接收到的原始数据如下:
Array ( [branches] => Array ( [0] => 630 [1] => 632 [2] => 715 ) [date] => Array ( [0] => 06/14/2022 [1] => 06/23/2022 [2] => 06/29/2022 ) [auditiors] => Array ( [0] => 3 [1] => 5 [2] => 4 ) [disbursed] => Array ( [0] => 797 [1] => 32 [2] => 234 ) [sample_selected] => Array ( [0] => 798 [1] => 2324 [2] => 1233 ) [days_cases] => Array ( [0] => 765 [1] => 21334 [2] => 12 ) [days_branches] => Array ( [0] => 32 [1] => 123 [2] => 1223 ) [total_days] => Array ( [0] => 797 [1] => 21457 [2] => 1235 ) )
解决方案
出现这个问题的根源是前端表单控件的命名规则不对,有两种处理方式:
方式1:修正前端表单命名(推荐,一劳永逸)
你当前的表单input命名应该是类似name="branches[]"、name="date[]"的格式,提交后数据自然会按字段维度分组。只要把命名改成带行索引的二维数组格式,提交后会自动按行组装数据:
{{-- 渲染表格行时带上循环索引 --}} @foreach($list as $index => $item) <tr> <td><input name="rows[{{$index}}][branches]" value="{{$item->branches ?? ''}}"></td> <td><input name="rows[{{$index}}][date]" value="{{$item->date ?? ''}}"></td> <td><input name="rows[{{$index}}][auditiors]" value="{{$item->auditiors ?? ''}}"></td> <td><input name="rows[{{$index}}][disbursed]" value="{{$item->disbursed ?? ''}}"></td> <td><input name="rows[{{$index}}][sample_selected]" value="{{$item->sample_selected ?? ''}}"></td> <td><input name="rows[{{$index}}][days_cases]" value="{{$item->days_cases ?? ''}}"></td> <td><input name="rows[{{$index}}][days_branches]" value="{{$item->days_branches ?? ''}}"></td> <td><input name="rows[{{$index}}][total_days]" value="{{$item->total_days ?? ''}}"></td> </tr> @endforeach
调整后后端直接通过$request->input('rows')就能拿到按行组织的规整数据,每个元素对应一行的完整字段,可直接用于批量入库。
方式2:后端重组现有数据
如果暂时无法调整前端代码,可以在后端对接收的按字段分组的数据做重组:
$input = $request->all(); $rows = []; // 以第一个字段的下标作为行遍历依据 foreach ($input['branches'] as $idx => $val) { $rows[] = [ 'branches' => $input['branches'][$idx], 'date' => $input['date'][$idx], 'auditiors' => $input['auditiors'][$idx], 'disbursed' => $input['disbursed'][$idx], 'sample_selected' => $input['sample_selected'][$idx], 'days_cases' => $input['days_cases'][$idx], 'days_branches' => $input['days_branches'][$idx], 'total_days' => $input['total_days'][$idx], ]; } // 重组完成的$rows可直接传入模型的insert方法批量写入数据库
注意事项
- 你当前接收的字段里
auditiors存在拼写偏差(常规应为auditors,意为审计员),建议前后端统一修正命名,避免后续出现字段匹配错误 - 数据入库前必须加字段校验,比如日期格式校验、数值字段的类型校验,避免非法数据写入
- 动态新增/删除表格行的场景下,优先使用第一种前端命名方案,不需要额外调整后端重组逻辑
内容的提问来源于stack exchange,提问作者bay_beast
相关产品推荐
相关产品推荐

