Laravel中动态表单多行数组数据存储及循环次数异常解决
解决Laravel中动态表单数组插入多行记录的问题
嘿,咱们先搞明白为啥你的循环跑了6次而不是预期的3次:
你直接遍历$request->all()的时候,如果表单字段没按正确的嵌套数组格式命名,请求数据会被拆成一堆扁平的键值对(比如0[make]、0[model]这种单独的键),foreach自然会把这6个键值对都跑一遍,所以就执行了6次。
第一步:先把表单字段命名改对
要让Laravel正确识别你想要的数组结构,表单里的字段得这么写:
<!-- 第一条车辆记录 --> <input type="text" name="vehicles[0][make]" value="test"> <input type="text" name="vehicles[0][model]" value="XYZ"> <!-- 第二条车辆记录 --> <input type="text" name="vehicles[1][make]" value="s4"> <input type="text" name="vehicles[1][model]" value="BB"> <!-- 第三条车辆记录 --> <input type="text" name="vehicles[2][make]" value="99"> <input type="text" name="vehicles[2][model]" value="AX">
这样提交后,你用$request->get('vehicles')拿到的数据就是你最开始期望的结构:
[ 0 => ['make' => 'test', 'model' => 'XYZ'], 1 => ['make' => 's4', 'model' => 'BB'], 2 => ['make' => '99', 'model' => 'AX'] ]
第二步:正确循环插入数据
现在就可以舒舒服服遍历这个数组,每次循环插一条记录啦:
// 先拿到整理好的车辆数组 $vehicles = $request->input('vehicles'); // 遍历每条记录插入数据库 foreach ($vehicles as $vehicle) { // 这里假设你的模型叫Vehicle,记得换成你实际的模型名哦 Vehicle::create([ 'make' => $vehicle['make'], 'model' => $vehicle['model'] ]); }
注意哦:一定要给你的模型设置
$fillable属性,允许批量赋值,不然Laravel会报错的:
class Vehicle extends Model { protected $fillable = ['make', 'model']; }
更高效的批量插入玩法(可选)
如果要插的数据比较多,用批量插入会更省资源,只需要一次数据库查询就能搞定:
$vehicles = $request->input('vehicles'); // 直接批量插入,爽得很 Vehicle::insert($vehicles);
再说说为啥之前的代码跑6次
要是你之前的表单字段是这么写的:
<input name="make[]" value="test"> <input name="model[]" value="XYZ"> <input name="make[]" value="s4"> <input name="model[]" value="BB">
那$request->all()返回的结构会是这样:
[ 'make' => ['test', 's4', '99'], 'model' => ['XYZ', 'BB', 'AX'] ]
这时候你直接遍历$request->all(),会先把make数组的3个元素跑一遍,再把model数组的3个元素跑一遍,总共就6次了。这种情况也能救,就是把两个数组合并成预期的结构:
$makes = $request->input('make'); $models = $request->input('model'); $vehicles = []; foreach ($makes as $index => $make) { $vehicles[] = [ 'make' => $make, 'model' => $models[$index] ]; } // 然后插入数据就行 Vehicle::insert($vehicles);
不过还是推荐第一种表单命名方式,结构清晰,不容易搞混~
内容的提问来源于stack exchange,提问作者Khirad Zahra
相关产品推荐
相关产品推荐

