Laravel Excel实现CSV导入后数据库存入NULL值问题求助
问题排查与解决方案
我之前也碰到过一模一样的情况,dd能看到数据但存库全是NULL,大概率是Eloquent模型的批量赋值限制在搞鬼,咱们一步步来排查:
1. 优先检查Student模型的$fillable属性
这是最常见的原因:Laravel的Eloquent默认会保护模型,只有在$fillable数组中声明的字段,才能通过new Model([...])这种批量赋值的方式写入数据库。如果你的Student模型没把导入的字段加到$fillable里,所有字段都会被过滤,最终存入NULL。
打开你的Student.php模型,确保所有要导入的字段都在$fillable中:
class Student extends Model { // 把你在DoctoranziImport中用到的所有字段都添加到这里 protected $fillable = [ 'nume', 'initiale', 'prenume', 'tip_act_identitate', 'cnp', 'data_nastere', 'prenume_tata', 'prenume_mama', 'nume_casatorie', 'telefon', 'email', 'sex', // ... 剩下的所有字段 ]; }
2. 确认CSV表头与$row键名完全匹配
虽然你说dd($row)显示数据正常,但还是要再核对一遍:CSV的表头名称(比如nume)和你在代码中使用的$row['nume']是否完全一致(包括大小写、下划线/空格的转换)。Laravel Excel的WithHeadingRow默认会将表头转为小写并把空格替换成下划线,但如果你的CSV表头有特殊格式,可能会导致键名不匹配。
3. 测试手动赋值排除批量赋值问题
可以暂时修改DoctoranziImport中的model方法,改用手动赋值的方式测试:
public function model(array $row) { // 省略之前的逻辑... $student = new Student(); $student->nume = $row['nume']; $student->initiale = $row['initiale']; $student->prenume = $row['prenume']; // 逐个赋值其他字段... $student->an_studiu = 1; $student->admis = 1; $student->save(); return $student; }
如果这样能成功存入数据,那100%是$fillable的问题。
4. 排除模型观察者/全局作用域的干扰
如果以上都没问题,可以暂时禁用Student模型的观察者(如果有的话),或者检查是否有全局作用域在修改字段值,导致数据被清空。
内容的提问来源于stack exchange,提问作者user14399919
相关产品推荐
相关产品推荐

