quince/data-importer

该包已被废弃,不再维护。未建议替代包。

将表格数据文件导入Laravel模型工具

v1.0.1 2015-03-02 11:09 UTC

This package is not auto-updated.

Last update: 2023-05-07 21:55:53 UTC


README

将表格数据文件导入Laravel模型工具

安装

将data-importer添加到你的composer.json文件中。

对于laravel 4

"require": {
  "quince/data-importer": "~1.0"
}

对于laravel 5

"require": {
  "quince/data-importer": "~2.0"
}

使用composer安装此包。

$ composer update

注册包

app/config/app.php中找到的提供者数组内注册服务提供者。

'providers' => array(
    'Quince\DataImporter\DataImporterServiceProvider'
)

配置

下一步是运行以下命令发布包配置:

在laravel 4中运行

$ php artisan config:publish quince/data-importer

在laravel 5中运行

$ php artisan vendor:publish

配置文件可在laravel 4中的app/config/packages/quince/data-importer/config.php和laravel 5中的config/quince/data-importer.php中找到。

使用方法

您可以使用data-importer的两种方式

使用Laravel IoC容器

请确保导出服务管理器已在您的应用程序配置中注册。

<?php

// Initialize required data
$filePath = '/absolute/path/to/file/to/import';
$bindingModel = '/Namespace/ToYour/Model'; // or YourModel::class

// get data-importer out of IoC
$importer = App::make('importer');

/** @var RowsCollection $data */
$importer->import($filePath, $bindingModel, function($data) {
	// whatever you want to do with data
	// $data is an instance of RowsCollection
	// for example
	
	/** @var RowData $row */
	foreach ($data as $row) {
	    YourModel::create($row->getBase());
	}
});

使用Laravel依赖注入

您也可以在您的类中注入Quince\DataImporterManager并使用它。

<?php

use Quince\DataImporterManager as Importer;

class ExampleClass {

	protected $importer

	public function __construct(Importer $importer)
	{
		$this->importer = $importer;
	}

	public function exampleMethod($file)
	{
		$this->importer->import($file->getPath(), DesiredModel::class, function($data) {
			// whatever you want to do with data
		});
	}

}

高级使用

文件中的每一行都是数据库中记录的表示者,每条记录可能都有相关记录。在您的CSV文件中,一列可能包含这些相关记录。该列的标题是关系名称和该列中提供的关系字段名称的连接(如果配置文件中设置了relation_joint,则与连接符连接)。如果一列有多个相关记录,则应使用配置文件中设置的relation_value_delimiter将值分隔。

示例

下面的文件

名称 用户名 电子邮件 电话号码
John Doe Johny J.Doe@mail.com 0941120773
Jane Doe Jane6 miss.J.Doe@gmail.com 0929339687|0916740160

将被转换成类似这样(作为JSON):

[
	{
		"name": "John Doe",
		"username": "Johny",
		"email": "J.Doe@mail.com",
		"phones": [
			{
				"number": "0941120773"
			}
		]
	},
	{
		"name": "Jane Doe",
		"username": "Jane6",
		"email": "miss.J.Doe@gmail.com",
		"phones": [
			{
				"number": "0929339687"
			},
			{
				"number": "0916740160"
			}
		]
	}
]

附加字段

当文件中只提供了表的一些字段时,您可以手动设置这些字段。

注意: 您应指定附加字段是为主记录还是相关记录

<?php

// Initialize required data
$filePath = '/absolute/path/to/file/to/import';
$bindingModel = '/Namespace/ToYour/Model'; // or YourModel::class
$additionalFields = [
	'base' => [
		'column_name' => 'value'
	],
	'relation' => [
		'relation_name' => [
			'column_name' => 'value'
		]
		// another relations goes heare
	]
];

// get data-importer out of IoC
$importer = App::make('importer');

$importer->setAdditionalFields($additionalFields)
         ->import($filePath, $bindingModel, function($data) {
         	// whatever you want to do with data
         });

如果指定的附加字段在CSV文件中存在,数据将从中加载。但是,如果将true作为setAdditionalFields的第二个参数传递,则附加字段将覆盖CSV文件中的现有数据。

$importer->setAdditionalFields($additionalFields, true)
         ->import($filePath, $bindingModel, function($data) {
         	// whatever you want to do with data
         });

翻译文件标题

当您的文件列标题与您的表列不同时,您可以将它们映射到您的数据库表列。假设您的文件如下所示:

真实姓名 昵称 电子邮件地址 电话号码
John Doe Johny J.Doe@mail.com 0941120773
Jane Doe Jane6 miss.J.Doe@gmail.com 0929339687|0916740160

您可以为您的文件自定义标题传递一个字典,将其翻译为其表列名称。

<?php

// Initialize required data
$filePath = '/absolute/path/to/file/to/import';
$bindingModel = '/Namespace/ToYour/Model'; // or YourModel::class
$dictionary = [
	'Real Name'		=> 'name',
	'Nickname'		=> 'username',
	'Mail Address'	=> 'email',
	'Phone Numbers'	=> 'phones.number'
];

// get data-importer out of IoC
$importer = App::make('importer');

$importer->setDictionary($dictionary)
         ->import($filePath, $bindingModel, function($data) {
         	// whatever you want to do with data
         });

您还可以将您的文件的单列映射到数据库表的列。

$importer->setColumnDictionary($columnName, $translation)
         ->import($filePath, $bindingModel, function($data) {
         	// whatever you want to do with data
         });

有关高级用法的信息,请访问wiki页面

配置文件

字段 描述 默认值
分隔符 用于在行中分隔每列的字符。 ,
封装符 用于指定封装符的字符。 "
转义符 用于转义无效字符的字符。 \
chunk_size 传递给导入方法中闭包处理的行的大小。 100
relation_joint 用于连接关系名称和要导入的关系表的列的字符。 .
relation_value_delimiter 用于分隔关系值的字符。 |