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

Laravel导入Excel多行数据遇‘undefined offset name’错误求助

Laravel Excel导入报错'undefined offset name'排查解决

核心错误定位

你的LeadsImport类存在两个致命逻辑错误,直接触发了undefined offset 'name'报错:

  1. 方法参数错误:ToModel接口要求model方法接收单行数据数组,参数应为$row而非$rows。你当前用$rows作为参数,再对其做foreach遍历,实际遍历的是单行的单个字段值,此时$row变为字符串/数值,自然不存在'name'键。
  2. 多余的循环逻辑: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:42:48