mtcmedia/laravel-import

Laravel 框架的通用数据导入工具

v0.1.0 2018-11-08 14:29 UTC

This package is auto-updated.

Last update: 2024-08-29 04:54:32 UTC


README

此包允许您将数据导入 Laravel 应用程序。此包使用 JSON 格式的源映射,其中您定义了源数据与预期数据库结构之间的映射。

运行命令

包使用 artisan 命令来运行各自源转换驱动程序的导入命令。

 php artisan import:csv source_map_file_name import_data.csv --header-offset=1
 php artisan import:json source_map_file_name import_data.json
 php artisan import:xml source_map_file_name import_data.xml
 php artisan import:database source_map_file_name import_data.csv --prefix=prfx

这些命令将从存储路径加载源映射文件,并尝试处理传递给数据的数据。

安装

此包与 Laravel 5.5 或更高版本兼容。您可以通过以下命令使用 composer 安装此包:

composer require mtcmedia/laravel-import

虽然 Laravel 5.4 或更低版本未官方支持,但如果注册了服务提供者,则功能应该可以工作。这可以通过在 config/app.php 文件中添加服务提供者来完成。

'providers' => [
    // ...
    Mtc\Import\Providers\ImportServiceProvider::class,
];

使用

导入功能由相应驱动程序的 artisan 命令调用。

 php artisan import:csv source_map_file_name import_data.csv --header-offset=1
 php artisan import:json source_map_file_name import_data.json
 php artisan import:xml source_map_file_name import_data.xml
 php artisan import:database source_map_file_name import_data.csv --prefix=prfx

定义可导入模型

要允许在模型上导入数据,您需要将 Mtc\Import\Traits\Importable 特性添加到您的 Eloquent 模型中。

class Item extends Model {
    use Mtc\Import\Traits\Importable;
    ...

这将向模型提供额外的导入方法。

要查看允许导入的字段,包将在模型上查找 $importable 属性。此属性应定义可以填充的列。如果模型上未定义 $importable 字段,它将回退到使用 $fillable 作为导入列的基础。如果模型未使用 $fillable 属性,它将使用最后的手段连接到数据库并允许所有列。

还可以在模型列上定义回退值,以确保使用 $importable_defaults 属性在模型上为属性设置正确的数据类型。

protected $importable_defaults = [
    'price' => 0,
    'sort_price' => 0,
];

至于导入相关模型,包将期望存在 $importable_relationships 属性。如果此属性未设置,则不允许导入关系,即使它们是源映射的一部分。可导入关系应遵循以下示例。

    protected $importable_relationships = [
        'images' => [
            'type' => HasMany::class,
            'model' => Image::class,
        ],
        'custom' => [
            'type' => HasOne::class,
            'model' => Custom::class,
        ],
    ];

定义源映射

在执行导入之前必须定义源文件,并应遵循概述的示例。

{
    "model": "App\\Product",
    "query": {
        "table": "product",
        "relationships": {
            "ProductSupplier": {
                "table": "product_supplier",
                "parent_column": "id_product",
                "child_column": "id_product",
                "relationships": {
                    "Supplier": {
                        "table": "supplier",
                        "parent_column": "id_supplier",
                        "child_column": "id_supplier"
                    }
                }
            },
            "Language": {
                "table": "product_lang",
                "parent_column": "id_product",
                "child_column": "id_product"
            },
            "Image": {
                "table": "image",
                "parent_column": "id_product",
                "child_column": "id_product"
            }
        }
    },
    "data_map": {
        "id": "id_product",
        "reference": "reference",
        "seller_id": "ProductSupplier.Supplier.id_customer",
        "status": "~external(App\\CustomDataProcessor,getLotStatus)",
        "name": "Language.name",
        "description": "Language.description_short",
        "images": [
            {
                "name": "Image.*.~external(App\\CustomDataProcesso,downloadImage,https://www.example.com)",
                "default": "Image.*.cover",
                "order": "Image.*.position"
            }
        ]
    }
}

源映射分为 3 个顶级对象

  • model - 定义将用于填充数据的基数据模型
  • query - 仅适用于数据库模型。定义数据结构以允许从多个表加载数据,而无需在导入端为数据创建模型
  • data_map - 当前应用程序的字段与导入数据结构中相应字段之间的映射

支持的方法/内置逻辑

由于数据很少一对一地从一种结构传输到另一种结构,因此有一些内置的方法可以帮助数据迁移。

循环

导入数据通常需要处理具有子项的规范化数据。而不是为这些子项创建单独的导入映射和处理,此包允许处理循环数据(例如,具有多个图片的项目)。

默认情况下,包使用 * 符号来标识循环项,但这可以在导入配置中更改。当使用循环结构时,关系将遍历所有可能的条目并为它们创建子条目。 注意 此功能仅支持从同一结构中获取数据,它不允许从两个不同的数据循环中加载数据。

上下文函数

导入引擎使用上下文函数,这些函数通过在其名称前使用波浪线符号,并将属性放在括号中来简单标识,结果格式如下: ~function()
目前支持以下上下文函数

  • ~compare(field,compare_value,compare_operator,true_value,false_value) - 允许比较值。使用 compare_operator 检查 fieldcompare_value。根据比较结果返回 true_valuefalse_value
  • ~int() - 将值转换为整数
  • ~float() - 将值转换为浮点数
  • ~now(format) - 返回 Carbon::now(format) 时间戳。 format 是可选的,如果省略,则使用默认字符串时间戳。
  • ~concat(argument1,argument2) - 将参数列表连接在一起。支持无限制数量的参数
  • ~external(class_name,method_name,arguments) - 允许将数据传递给外部脚本以解决自定义映射。在调用方法时,它将传递包含当前数据结构的 $data 属性以及参数列表。

可扩展性

扩展功能的主要选项是在映射过程中。这可以通过将字段映射到允许调用解析数据值的 ~external() 方法来完成。

配置

此包提供 2 个配置文件(database.phpimport.php)。

database.php 通过添加新的导入源连接来扩展主数据库配置。此源用于数据库导入流程。

import.php 为包提供配置选项,如更改存储目录中的导入文件路径、定义数据库块大小或更改循环运算符符号。

贡献

有关详细信息,请参阅 CONTRIBUTING

安全性

如果您发现任何安全相关的问题,请通过电子邮件 opensource@mtcmedia.co.uk 来报告,而不是使用问题跟踪器。

许可

GNU 通用公共许可证(GPL)。请参阅 许可文件 获取更多信息。