langleyfoxall / eloquent-csv-importer
轻松将 CSV 文件映射到 Eloquent 模型
v1.1.0
2020-01-17 10:18 UTC
Requires
- php: ^7.0.0
- illuminate/database: >=5.0
- illuminate/http: >=5.0
- illuminate/support: >=5.0
- league/csv: ^9.1
Requires (Dev)
- mockery/mockery: ^1.2
- orchestra/testbench: 3.7.*
- phpunit/phpunit: ^7.4
This package is auto-updated.
Last update: 2024-09-17 20:07:35 UTC
README
Eloquent CSV Importer 帮助创建和存储列映射,以实现轻松将 CSV 数据转换为 Eloquent 模型
安装
可以使用 Composer 轻松安装 Eloquent CSV Importer。只需从项目的根目录运行以下命令。
composer require langleyfoxall/eloquent-csv-importer
在 Laravel 5.5+ 中,服务提供者被设置为自动发现 - 在旧版本中,您需要在 config/app.php
中手动注册它
LangleyFoxall\EloquentCSVImporter\EloquentCSVImporterServiceProvider::class
之后,发布供应商文件以将 CSV 定义迁移复制到您的迁移文件夹。
php artisan vendor:publish
文档
入门
- 发布迁移,向 csv_defintions 表添加任何您想要的额外列,并执行迁移。
php artisan migrate
- 将
CSVMappable
和HasCSVDefinitions
特性添加到您想要存储 CSV 定义的对应用户模型中。
... use LangleyFoxall\EloquentCSVImporter\Traits\CSVMappable; class Product extends Model { use CSVMappable, HasCSVDefinitions; ... }
- 指定允许映射的列,通过覆盖
getCSVMappableColumns()
函数,默认情况下它使用模型的所有列。
public static function getCSVMappableColumns() { return collect([ 'product_name', ]); }
- 为要映射到的模型创建 CSV 定义
$definition = (new CSVDefinitionFactory(Product::class)) ->mapColumns(['product ID' => 'product_name']) ->setMeta([ 'name' => '2009 - 2010 products', 'description' => 'Definitions for the 2009 - 2010 product lists', ])->create();
- 现在您可以使用创建的定义将 CSV 文件/字符串转换为相关模型。
$def = Product::first()->CSVDefinitions()->first; $products = $def->makeModels($csvFile, []);
按列更新
Eloquent CSV Importer 不仅允许从 CSV 创建模型,还允许根据 CSV 中指定的键更新模型。
假设您有以下 CSV
以及以下代码将 CSV 文件映射到您的模型
$products = $def->makeModels($csvFile, ['product ID']);
上面的代码现在将通过查找产品名称等于当前 CSV 行中的值的现有产品来更新或创建产品模型,或者如果没有现有产品,则创建一个新模型,其数据来自当前 CSV 行。
您可以传递多个键进行更新,如下所示
$products = $def->makeModels($csvFile, ['product ID', 'price']);
这将更新一个现有的产品,其中产品中的两个值都等于 CSV 行中指定的值。
数据项操作
如果您愿意,可以在从 CSV 导入数据时操作数据。为此,您必须创建一个新的数据项操作函数,并将其设置到 CSV 定义中。
数据项操作函数将接收数据项键、值以及 CSV 的整个行的副本。在更改后,应返回修改后的数据项值。
以下示例将接收到的任何值转换为大写。
$definition->setDataItemManipulator(function($key, $value, $row) { return strtoupper($value); });
在调用 makeModels
或 createModels
方法之前应设置数据项操作。