Laravel使用Maatwebsite Excel导入xlsx数据无法存入数据库是什么原因
问题原因
- 错误遍历单行数据:
ToModel接口的model()方法会自动逐行读取Excel内容,每次调用传入的$row本身就是单一行的列数据数组,你额外写foreach ($row as $data)属于遍历当前行的每一列值,逻辑完全不符合预期。 - 重复判断逻辑失效:你用
DB::table('tbl_pegawai')->where('nip', $row[0])->get()返回的是Laravel集合对象,哪怕没有匹配数据也会返回空集合,用empty()判断空集合永远返回false,所以写入逻辑永远不会触发。 - 可能缺少模型批量赋值配置:如果你的
PegawaiModel没有配置$fillable属性允许对应字段批量赋值,就算返回模型实例也会被Laravel过滤字段,无法写入数据库。
修复后的导入类代码
<?php namespace App\Imports; use App\Models\PegawaiModel; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithStartRow; class ImportPegawai implements ToModel, WithStartRow { public function model(array $row) { // 直接判断nip是否存在,用exists()判断效率更高 $exists = PegawaiModel::where('nip', $row[0])->exists(); if (!$exists) { return new PegawaiModel([ 'nip' => $row[0], 'nama_lengkap' => $row[1], 'pangkat' => $row[2], 'gol' => $row[3], 'jabatan' => $row[4], 'unit_kerja' => $row[5] ]); } // 重复数据返回null即可跳过写入 return null; } public function startRow(): int { return 3; } }
额外检查项
确认PegawaiModel中配置了$fillable属性允许对应字段批量赋值,示例如下:
// PegawaiModel.php protected $fillable = [ 'nip', 'nama_lengkap', 'pangkat', 'gol', 'jabatan', 'unit_kerja' ];
同时检查数据库tbl_pegawai表的字段类型、长度与导入数据匹配,必填字段没有缺失值。
内容的提问来源于stack exchange,提问作者mfahmifadh
相关产品推荐
相关产品推荐

