使用maatwebsite/excel导入时仅创建第一个Eloquent模型的问题求助
问题分析与解决方案
问题根源
- 代码执行终止:
model方法中return new Siswa(...)语句会直接终止方法执行,后续创建User的代码完全不会被运行。 - 未持久化User对象:就算User的代码能执行,仅
new User(...)只是创建内存对象,没有调用save()或create()方法将数据写入数据库。 - 关联逻辑错误:Siswa的
user_id直接使用Excel中的row[4],但如果是导入时新建User,应该用刚创建的User的主键ID,否则会导致关联失效。
修正后的代码
修改SiswaImport类的model方法
public function model(array $row) { // 先创建并保存User $user = User::create([ 'name' => $row[5], 'email' => $row[10], 'password' => bcrypt($row[3].'*'), 'outlet_id' => $row[22], ]); // 使用新创建的User的ID关联Siswa,返回的Siswa模型会被maatwebsite/excel自动保存 return new Siswa([ 'created_at' => $row[1], 'updated_at' => $row[2], 'nis' => $row[3], 'user_id' => $user->id, // 替换为刚创建的User的ID 'nama' => $row[5], 'nik' => $row[6], 'alamat' => $row[7], 'ayah' => $row[8], 'ibu' => $row[9], 'email' => $row[10], 'kerja_ayah' => $row[11], 'kerja_ibu' => $row[12], 'wali' => $row[13], 'kerja_wali' => $row[14], 'telpon_ayah' => $row[15], 'telpon_ibu' => $row[16], 'kelas' => $row[17], 'referensi' => $row[18], 'note' => $row[19], 'channel' => $row[20], 'url_foto' => $row[21], 'outlet' => $row[22], 'penilaian1' => $row[23], 'penilaian2' => $row[24], 'penilaian3' => $row[25], 'penilaian4' => $row[26], 'penilaian5' => $row[27], 'target' => $row[28], 'prodi_id' => $row[29], ]); }
额外注意事项
- 确保User模型的
$fillable属性包含name、email、password、outlet_id字段,否则create()方法会因批量赋值限制失败。 - 若Excel中可能存在重复的email,建议添加重复检查逻辑,避免创建重复User:
$user = User::firstOrCreate( ['email' => $row[10]], [ 'name' => $row[5], 'password' => bcrypt($row[3].'*'), 'outlet_id' => $row[22], ] );
内容的提问来源于stack exchange,提问作者M. Rivaldi Anwar Putra
相关产品推荐
相关产品推荐

