php - laravel excel with upserts 不更新数据
问题描述
我有一个 csv 文件,里面有数据。我想将它导入我的数据库。如果 csv 文件中有重复数据,我不希望它创建新的重复记录,我想要更新它。
但问题是,它正在创造新的重复记录。
控制器(缩写):
Excel::import(new FruitImport, $request->file('fruits_file'), \Maatwebsite\Excel\Excel::XLSX);
导入文件(缩写):
class FruitImport implements ToModel, WithUpserts, ... {
public function model(array $row) {
return new Fruit([
'color' => $row[0],
'taste' => $row[1],
'smell' => $row[2],
'name' => $row[3],
'price' => $row[4],
'supplier_id' => $row[5],
...
]);
}
public function uniqueBy() {
return ['color', 'taste', 'smell', 'name'];
}
...
}
所以基本上,如果我将一个包含相同颜色、味道、气味、名称的行的 csv 文件导入到我的数据库中,我希望它能够被更新。如果我的数据库中的任何记录具有相同的颜色、味道、气味和名称数据,则相同。
我的桌子:
Field | Type | Key | ...
id | big int un..| Pri |
color | varchar(12) | |
taste | varchar(12) | |
smell | varchar(12) | |
name | char(20) | |
...
我正在使用 Laravel 8、Php 8.0.2 和 Mysql 8。Laravel excel 是 3.1 版
我的参考资料:
https://laravel.com/docs/8.x/eloquent#upserts
https://docs.laravel-excel.com/3.1/imports/model.html#upserting-models
有任何想法吗?
解决方案
我不确定Laravel Excel 中的 Upsert是否是您想要的。具体来说,文档中列出的条件(在我看来)过于严格。
除 SQL Server 之外的所有数据库都要求 uniqueBy 列具有“主”或“唯一”索引。
要以自定义方式导入电子表格数据,您始终可以使用ToCollection
关注点。这将使您可以完全控制条目的保存方式。
https://docs.laravel-excel.com/3.1/imports/collection.html
使用该updateOrCreate()
方法查找具有您指定的选项的现有条目,方法是将它们传递到第一个数组中,其余数据在第二个数组中。
https://laravel.com/docs/8.x/eloquent#upserts
class FruitImport implements ToCollection ...
{
public function collection(Collection $rows)
{
foreach ($rows as $row)
{
Fruit::updateOrCreate(
[
'color' => $row[0],
'taste' => $row[1],
'smell' => $row[2],
'name' => $row[3]
],
[
'price' => $row[4],
'supplier_id' => $row[5],
...
]
);
}
}
}
推荐阅读
- c# - 在 foreach 中通过引用从 Collection 中获取元素
- angular - 角度 2 - 6 日期表单字段防止清除
- javascript - Typescript 从 JavaScript 迁移,构建错误
- python - 只要按住拍摄按钮,如何继续拍摄
- node.js - 写入 cookie 时发送后无法设置标头
- unit-testing - 如何在 Salesforce 中执行“lastmodified”日期的测试类覆盖?
- php - 如何获取当前页面菜单项祖先名称wordpress
- xcode - 在 Xcode 中向 UITest Target 添加 aps-environment 权利
- vb.net - VB.NET - 如何添加我的扩展
- java - BPXWUNIX:尝试运行 Regina Rexx 脚本时未发现错误