如何将POST请求中对象数组形式的多条记录保存到Laravel
批量保存勾选航班数据的解决方案
问题根源
你遇到的错误原因很明确:
- 前端发送数组时,
$request->all()直接返回这个数组,不需要额外取$datas[0],否则会触发「Undefined array key 0」错误。 - 遍历的数组元素是普通数组/对象,并非
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
相关产品推荐
相关产品推荐

