langleyfoxall/eloquent-csv-importer

轻松将 CSV 文件映射到 Eloquent 模型

v1.1.0 2020-01-17 10:18 UTC

README

Travis Status

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

文档

入门

  1. 发布迁移,向 csv_defintions 表添加任何您想要的额外列,并执行迁移。
php artisan migrate
  1. CSVMappableHasCSVDefinitions 特性添加到您想要存储 CSV 定义的对应用户模型中。
...

use LangleyFoxall\EloquentCSVImporter\Traits\CSVMappable;

class Product extends Model
{
    use CSVMappable, HasCSVDefinitions;
    
    ...
    
}
  1. 指定允许映射的列,通过覆盖 getCSVMappableColumns() 函数,默认情况下它使用模型的所有列。
public static function getCSVMappableColumns()
{
    return collect([
        'product_name',
    ]);
}
  1. 为要映射到的模型创建 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();
  1. 现在您可以使用创建的定义将 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);
});

在调用 makeModelscreateModels 方法之前应设置数据项操作。