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
相关产品推荐
相关产品推荐

