Laravel导入Excel多行数据遇‘undefined offset name’错误求助
Laravel Excel导入报错'undefined offset name'排查解决
核心错误定位
你的LeadsImport类存在两个致命逻辑错误,直接触发了undefined offset 'name'报错:
- 方法参数错误:
ToModel接口要求model方法接收单行数据数组,参数应为$row而非$rows。你当前用$rows作为参数,再对其做foreach遍历,实际遍历的是单行的单个字段值,此时$row变为字符串/数值,自然不存在'name'键。 - 多余的循环逻辑:Maatwebsite Excel的
ToModel实现会自动遍历Excel每一行数据,无需手动添加循环,手动循环会导致仅处理第一行的第一个字段就返回,完全偏离预期逻辑。
修复步骤
1. 修正导入类的model方法
将参数改为$row,移除多余循环:
<?php namespace App\Imports; use App\Models\LeadDetails; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithHeadingRow; class LeadsImport implements ToModel, WithHeadingRow { /** * @param array $row * * @return \Illuminate\Database\Eloquent\Model|null */ public function model(array $row) { return new LeadDetails([ "full_name" => $row['name'], "student_email" => $row['email'], "phone_number" => $row['contact'], "work_location" => $row['work_location'], "lead_apply_date" => $row['date'], "lead_remarks" => $row['remark'], ]); } }
注:已移除代码中重复的
phone_number赋值,避免冗余。
2. 验证Excel表头匹配性
确保Excel文件第一行表头与代码中使用的键完全一致(大小写敏感):
- 表头必须为
name、email、contact、work_location、date、remark,若Excel表头是Name/NAME或中文名称,需同步修改代码中的键名。 - 若表头不在第一行(比如第二行才是表头),需在导入类中指定起始行:
public function startRow(): int { return 2; // 表头位于第二行时设置 }
3. 可选:添加字段容错校验
为避免某行缺失字段导致报错,可添加空值校验与默认值:
public function model(array $row) { // 跳过空行或缺失核心字段的行 if (empty($row['name']) || empty($row['email'])) { return null; } return new LeadDetails([ "full_name" => $row['name'], "student_email" => $row['email'], "phone_number" => $row['contact'] ?? '', "work_location" => $row['work_location'] ?? '', "lead_apply_date" => $row['date'] ?? now(), "lead_remarks" => $row['remark'] ?? '', ]); }
4. 控制器补充文件合法性校验
在控制器中添加文件类型与必填校验,拦截非法请求:
public function uploadLeadExcel(Request $request) { $request->validate([ 'file' => 'required|mimes:xlsx,xls,csv', ]); Excel::import(new LeadsImport, $request->file('file')); return response()->json([ 'message'=>'success', 'status'=>201 ]); }
内容的提问来源于stack exchange,提问作者quad que
相关产品推荐
相关产品推荐

