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

Laravel8 Excel导入时如何从单个数组向数据库添加2条记录

问题原因

当前代码无法生成两条记录的核心原因有两个:

  1. PHP数组不允许重复键名,传入temp_csv_data构造函数的数组里title/firstName/lastName各出现了两次,后面的第二组值会直接覆盖第一组值,最终构造参数里只保留了第二个人的信息
  2. Laravel Excel的model()方法默认接收单个模型实例时仅插入1条记录,要实现单行导入生成多条记录,需要返回模型实例数组,扩展包会自动遍历数组完成所有记录的入库。
解决方案

不需要重构现有名称排序、解析的逻辑,只需要调整model()方法内的返回逻辑,拆分人员数据到独立模型实例即可,无冗余代码:

public function model(array $row)
{
    if (count($row) == 3) {
        $homeowner = new ThreeWordName($row);
    } elseif (count($row) == 7) {
        $homeowner = new SevenWordName($row);
    }

    $sorter = new CsvNameSorter;
    $sorter->sort($homeowner);
    $parsedName = $homeowner->name;

    // 先封装第一位人员的模型实例
    $records = [
        new temp_csv_data([
            'title'     => $parsedName['title'],
            'firstName' => $parsedName['firstName'],
            'lastName'  => $parsedName['lastName'],
        ])
    ];

    // 7字段行包含第二位人员,追加对应模型实例
    if (count($row) == 7) {
        $records[] = new temp_csv_data([
            'title'     => $parsedName['title2'],
            'firstName' => $parsedName['firstName2'],
            'lastName'  => $parsedName['lastName2'],
        ]);
    }

    // 返回模型数组,扩展包会自动完成所有记录的持久化
    return $records;
}
注意事项
  • 不要在model()方法内手动调用模型的save()方法,Laravel Excel会自动统一处理入库逻辑和事务,手动调用会导致重复写入
  • 该写法同时兼容3字段单人员、7字段双人员的导入场景,公共逻辑只写一次,没有重复冗余代码
  • 后续如果需要支持一行导入更多人员,只需要在解析完名称后循环对应字段追加模型实例即可,扩展成本极低

内容的提问来源于stack exchange,提问作者Abdul Samad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:03:28