mtcmedia / laravel-import
Laravel 框架的通用数据导入工具
Requires
- league/csv: ^9.1
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
检查field
与compare_value
。根据比较结果返回true_value
或false_value
。~int()
- 将值转换为整数~float()
- 将值转换为浮点数~now(format)
- 返回Carbon::now(format)
时间戳。format
是可选的,如果省略,则使用默认字符串时间戳。~concat(argument1,argument2)
- 将参数列表连接在一起。支持无限制数量的参数~external(class_name,method_name,arguments)
- 允许将数据传递给外部脚本以解决自定义映射。在调用方法时,它将传递包含当前数据结构的$data
属性以及参数列表。
可扩展性
扩展功能的主要选项是在映射过程中。这可以通过将字段映射到允许调用解析数据值的 ~external()
方法来完成。
配置
此包提供 2 个配置文件(database.php
和 import.php
)。
database.php
通过添加新的导入源连接来扩展主数据库配置。此源用于数据库导入流程。
import.php
为包提供配置选项,如更改存储目录中的导入文件路径、定义数据库块大小或更改循环运算符符号。
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全性
如果您发现任何安全相关的问题,请通过电子邮件 opensource@mtcmedia.co.uk 来报告,而不是使用问题跟踪器。
许可
GNU 通用公共许可证(GPL)。请参阅 许可文件 获取更多信息。