Laravel 5.5中如何通过循环将易出错表的数据存入数据库?
在Laravel 5.5中实现批量循环存储数据
嘿,我来帮你把单条存储改成批量循环存储的逻辑,Laravel 5.5里其实很容易实现,分几个步骤来:
第一步:调整前端表单(关键!)
要批量提交多条数据,你的表单字段得改成数组格式,这样后端才能接收到一组数据。比如把原来的字段名加上[]:
<!-- 第一条数据 --> <input type="text" name="student_name[]" placeholder="学生姓名" required> <input type="text" name="gender[]" placeholder="性别" required> <input type="number" name="age[]" placeholder="年龄" required> <!-- 第二条数据(可以重复添加更多) --> <input type="text" name="student_name[]" placeholder="学生姓名" required> <input type="text" name="gender[]" placeholder="性别" required> <input type="number" name="age[]" placeholder="年龄" required>
第二步:修改控制器的验证逻辑
因为现在接收的是数组,验证规则也要对应调整,用*来指定数组中的每一个元素都要符合规则:
$this->validate($request, [ 'student_name.*' => 'required|max:50|unique:leads,student_name', 'gender.*' => 'required|max:50', 'age.*' => 'required|max:2', ]);
第三步:两种批量存储实现方式
方式一:循环单条保存(和原代码逻辑最接近)
这种方式和你原来的单条存储逻辑几乎一致,只是套了个循环,适合需要触发模型事件(比如saved/saving)的场景:
public function store(Request $request) { // 验证数组格式的输入 $this->validate($request, [ 'student_name.*' => 'required|max:50|unique:leads,student_name', 'gender.*' => 'required|max:50', 'age.*' => 'required|max:2', ]); // 循环处理每一条提交的数据 foreach ($request->student_name as $index => $name) { $lead = new Lead(); $lead->student_name = $name; $lead->gender = $request->gender[$index]; $lead->age = $request->age[$index]; $lead->save(); // 单条保存,会触发模型事件 } // 返回成功提示 return redirect()->back()->with('success', '所有学生数据已成功保存!'); }
方式二:批量插入(更高效,适合大数据量)
如果不需要触发模型事件,这种方式只需要一次数据库查询,性能更好:
public function store(Request $request) { // 同样先验证数据 $this->validate($request, [ 'student_name.*' => 'required|max:50|unique:leads,student_name', 'gender.*' => 'required|max:50', 'age.*' => 'required|max:2', ]); // 先把所有数据整理成数组集合 $leadsData = []; foreach ($request->student_name as $index => $name) { $leadsData[] = [ 'student_name' => $name, 'gender' => $request->gender[$index], 'age' => $request->age[$index], // 手动添加时间戳,因为insert方法不会自动填充 'created_at' => now(), 'updated_at' => now(), ]; } // 一次性批量插入到数据库 Lead::insert($leadsData); return redirect()->back()->with('success', '所有学生数据已批量保存完成!'); }
一些要注意的细节
- 唯一验证:如果提交的多条数据里有重复的
student_name,验证会直接失败,这符合你的规则要求; - 模型事件:批量插入(
insert)不会触发模型的saved/saving等事件,如果你的Lead模型有这些事件逻辑,建议用循环单条保存的方式; - 数据一致性:如果需要保证所有数据要么都保存成功,要么都失败,可以用数据库事务包裹代码,比如在循环或批量插入前加上
DB::beginTransaction(),成功后DB::commit(),失败则DB::rollBack()。
内容的提问来源于stack exchange,提问作者Copain
相关产品推荐
相关产品推荐

