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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:45:34