You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:27:48