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

Laravel Excel导入数据成功但total_score和rank字段插入0是什么原因?

可能的原因及排查方案


1. 列索引对应错误

你当前使用数字索引读取Excel行数据,$row[13]对应总分、$row[14]对应排名,很可能索引计数错误:

  • 你使用了WithHeadings接口,会自动跳过表头行,但列索引依然是从0开始计数,要确认Excel中总分、排名所在的列是否真的对应第14、15列(从左数第1列索引为0)
  • 检查Excel中是否存在隐藏列,会导致实际列数和你手动计数的结果不一致
    排查方法:在model方法第一行加临时调试代码,直接查看实际读取到的行数据中对应索引的值是否正确:
public function model(array $row)
{
    // 临时加这行打印对应索引的取值,确认数据是否匹配
    dd($row[13], $row[14]);
    $member_id = DB::table('members')->where('mbr_national_code', $row[3])->value('mbr_id');
    // 其余逻辑不变
}

2. 数据类型转换异常

如果Excel中这两个字段的单元格存在特殊格式,存入数据库的数字字段时会被自动转为0:

  • 单元格内容带空格、特殊符号、中文标点,比如" 95"、"100,0"、"85名"
  • 单元格是公式计算结果,导入时读取的是公式本身而非计算后的值
    排查方法:确认原始值格式有问题后,先做内容清理再赋值:
// 示例:清理非数字字符后再转整数
'total_score' => (int)preg_replace('/\D/', '', $row[13]),
'rank' => (int)preg_replace('/\D/', '', $row[14]),

3. 模型职责混写冲突

你把Laravel Excel的导入接口(FromCollection/WithHeadings等)写在了Eloquent模型上,这是错误的用法:
正常逻辑是单独写一个导入类实现Excel接口,Eloquent模型只负责对应数据库表,两种类的职责混写会导致读取、赋值逻辑异常。
正确结构示例:

// 独立的导入类
class ExamResultImport implements ToModel, WithHeadings
{
    public function model(array $row)
    {
        $member_id = DB::table('members')->where('mbr_national_code', $row[3])->value('mbr_id');
        return new ImportExamResult([
            // 原有赋值逻辑不变
        ]);
    }
}

// Eloquent模型只保留数据库相关配置
class ImportExamResult extends Model
{
    protected $table = 'import_exam_results';
    protected $primaryKey = 'id';
    protected $fillable = ['nid', 'candidate_id', 'status', 'member_id','olympiad_id','descriptive_score','four_choice_score','total_score','rank','batch']; 
}

4. 模型修改器/观察者拦截

检查ImportExamResult模型中是否存在字段修改器(setTotalScoreAttribute、setRankAttribute),或者注册了模型观察者,在数据保存前修改了这两个字段的值。


内容的提问来源于stack exchange,提问作者Pouya Vaghefi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:15:02