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

如何将POST请求中对象数组形式的多条记录保存到Laravel

批量保存勾选航班数据的解决方案

问题根源

你遇到的错误原因很明确:

  1. 前端发送数组时,$request->all()直接返回这个数组,不需要额外取$datas[0],否则会触发「Undefined array key 0」错误。
  2. 遍历的数组元素是普通数组/对象,并非Request实例,所以不能调用input()方法,这就是「Call to a member function input() on array」错误的由来。

修正后的基础处理代码

假设前端直接发送的是你展示的航班对象数组,后端可以这样修改:

public function store(Request $request)
{
    // 获取请求中的所有航班数据
    $flightsData = $request->all();

    // 遍历每条航班数据
    foreach ($flightsData as $flightData) {
        $flight = new Flights();
        // 直接通过数组下标访问字段(如果前端发的是对象,也可以用->属性访问)
        $flight->id_row_fr = $flightData['flight']['identification']['row'];
        $flight->flight_number = $flightData['flight']['identification']['number'];
        $flight->airline_iata = $flightData['flight']['airline']['code']['iata'];
        $flight->airline_icao = $flightData['flight']['airline']['code']['icao'];
        $flight->save();
    }

    return response()->json(['message' => '批量保存成功'], 201);
}

更高效的批量插入优化

如果需要处理的数据量较大,循环调用save()会多次执行SQL语句,推荐用insert()方法批量插入,性能更优:

public function store(Request $request)
{
    // 先验证所有字段合法性,避免脏数据入库
    $request->validate([
        '*.flight.identification.row' => 'required|integer',
        '*.flight.identification.number' => 'required|string',
        '*.flight.airline.code.iata' => 'required|string|max:2',
        '*.flight.airline.code.icao' => 'required|string|max:3',
    ]);

    $flightsData = $request->all();
    $insertData = [];

    foreach ($flightsData as $flightData) {
        $insertData[] = [
            'id_row_fr' => $flightData['flight']['identification']['row'],
            'flight_number' => $flightData['flight']['identification']['number'],
            'airline_iata' => $flightData['flight']['airline']['code']['iata'],
            'airline_icao' => $flightData['flight']['airline']['code']['icao'],
            'created_at' => now(),
            'updated_at' => now(),
        ];
    }

    // 批量插入,仅执行一次SQL
    Flights::insert($insertData);

    return response()->json(['message' => count($insertData).'条航班数据已批量保存'], 201);
}

额外说明

如果前端发送的数组是包裹在某个键名里(比如{"selectedFlights": [{}, {}]}),只需把$request->all()改成$request->input('selectedFlights')即可。

内容的提问来源于stack exchange,提问作者Vel Crow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:30:28