Laravel使用Maatwebsite/Excel导入仅首行数据入库如何解决
问题排查结果
你的导入仅写入首行数据是3处代码逻辑错误导致的:
- 核心触发原因:在遍历Excel行数据的
foreach ($rows as $row)循环内部写了return redirect(...)语句,第一次循环执行完(也就是处理完第一行数据)就直接终止了整个方法执行,后续所有行都不会被处理。 - 关联逻辑错误:你在循环开始前提前查询了users表的最大ID,后续所有教师数据关联的
user_id都固定用这个导入前的旧ID,而不是你刚创建的新User的ID,会导致所有教师记录都绑定到同一个用户上,数据关联完全错误。 - 冗余逻辑问题:外层套的
foreach ($id as $i)循环无意义,你查询时用了limit(1)本身只会返回1条结果,这个循环完全多余,同时代码里还引入了多个未实际使用的类,属于无效引用。
修复后的导入类代码
<?php namespace App\Imports; use App\Models\Teachers; use App\Models\User; use Illuminate\Support\Collection; use Maatwebsite\Excel\Concerns\ToCollection; // 如果需要自动跳过表头,引入该类 // use Maatwebsite\Excel\Concerns\WithHeadingRow; // 需要跳过表头的话,类实现接口改为 implements ToCollection, WithHeadingRow class ImportTeacher implements ToCollection { public function collection(Collection $rows) { // 如果不使用WithHeadingRow自动跳过表头,手动放开下一行移除第一行表头数据 // $rows = $rows->skip(1); foreach ($rows as $row) { // 创建用户后直接获取新生成的用户ID,不要提前查询导入前的旧ID $newUser = User::create([ 'email' => $row[1], 'password' => bcrypt('guru123'), 'role' => 'teacher', 'status' => $row[6], ]); Teachers::create([ 'user_id' => $newUser->id, // 绑定刚创建的新用户ID 'NIP' => $row[2], 'name' => $row[3], 'phone' => $row[4], 'gender' => $row[5], 'birth_date' => $row[7], 'address' => $row[8], 'foto' => 'profile.png', ]); } } }
配套调整说明
- 跳转逻辑移到控制器层:不要在导入类中写响应跳转代码,在控制器里调用
Excel::import(new ImportTeacher, $file)执行完导入后,再写return redirect('/list-guru')->with('success', 'Berhasil menambahkan');即可。 - 如果你的Excel第一行是列名表头,要么实现
WithHeadingRow接口自动跳过表头,要么手动调用skip(1)移除第一行数据,避免把表头文字当成业务数据写入数据库。 - 数据量较大时建议给导入逻辑包裹数据库事务,避免中途出错导致部分数据写入、部分未写入的不一致问题。
内容的提问来源于stack exchange,提问作者sannn
相关产品推荐
相关产品推荐

