Laravel8 Excel导入时如何从单个数组向数据库添加2条记录
问题原因
当前代码无法生成两条记录的核心原因有两个:
- PHP数组不允许重复键名,传入
temp_csv_data构造函数的数组里title/firstName/lastName各出现了两次,后面的第二组值会直接覆盖第一组值,最终构造参数里只保留了第二个人的信息 - 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
相关产品推荐
相关产品推荐

