feijs/model-importer

直接从Excel文件导入Eloquent模型

dev-master 2015-08-26 14:04 UTC

This package is auto-updated.

Last update: 2024-09-16 03:41:33 UTC


README

本包旨在提供一种灵活且可重用的解决方案,可以直接从Excel和csv文件导入Laravel Eloquent模型数据

功能

  • 简单直接导入
  • 列标题模型属性匹配
  • 导入相关模型
  • 为多个文件排队导入

安装

composer.json中添加包,并运行composer update

"require": {
	...
	"feijs/model-importer": "dev-master"
}

将ServiceProvider添加到config\app.php中的提供者

'Feijs\ModelImporter\ModelImporterServiceProvider',

用法

可导入模型

任何可以导入的模型都应该实现Model\ImportableInterface并使用Model\ImportableTrait

use Feijs\ModelImporter\Model\ImportableTrait as ImportableModelTrait;

class Student extends Eloquent implements ImportableModel
{
	use ImportableModelTrait;
}
属性

导入的数据与一组匹配属性上的现有数据进行匹配。这些应由getMatchAttributes方法返回。

	public function getMatchAttributes() 
	{ 
		return ['student_id', 'phonenumber'];
	}

这些匹配属性应该是可批量赋值的,因此应包含在fillable数组中

	public $fillable = ['student_id', 'phonenumber', '...'];

任何应该可导入但不是唯一的属性应由getImportAttributes返回。这些导入属性不一定需要包含在fillable数组中。

	public function getImportAttributes()
	{ 
		return ['name', 'email', 'street', 'zipcode', 'city'];
	}		
关系

要导入关系数据或将新导入的模型链接到现有关系,您可以指定应导入的关系。这些应由getImportRelations方法返回。请注意,此处指定的任何模型也应实现Model\ImportableInterface

以下关系可以导入:HasOneHasManyBelongsToBelongsToMany

    public function bankAccount(){
        return $this->hasMany('BankAccount');
    }

	public function getImportRelations() { return ['bankAccount']; }

导入功能

初始化

	$importer = App::make('Feijs\ModelImporter\ModelImporter');
	$importer->setModel('Student');

CSV导入设置

您可以使用setSettings方法覆盖csv导入设置和文件编码。

	$importer->setSettings([
		'csv' => [
			'enclosure' => '"',		//Default
			'delimiter' => ","		//Default
		],
		'encoding' => 'UTF-8'		//Default

	]);

输入

导入器的输入应至少包括以下内容

  • file (Symfony\Component\HttpFoundation\File\UploadedFile)
  • overwrite:更新现有数据?(boolean
  • model:一个包含模型属性 -> 列标题翻译的数组
  • defaults:一个包含模型 -> 属性 -> 默认值的数组

所有模型名称、属性和列名称都应该使用驼峰式(缩写)

导入单个文件

	$success = $importer->import(Input::all());

	//Equivalent with example input:
	$success = $importer->import([
		'file' 		=> Input::file('data.csv'),
		'overwrite' => false,
		'student'	=> [
				'student_id' 	=> 'studentnumber',
				'phonenumber' 	=> 'mobile',
				'city' 			=> 'city',
		],
		'defaults'  => [ 
				'student' => [ 'city' => 'Amsterdam' ]
		]
	]);

导入多个文件

要从一个请求中导入多个文件,请使用Distributor类importFiles方法。这将为每个文件排队导入。结果将写入日志。

  • 第一个参数是包含文件的数组
  • 第二个参数与单文件导入的输入数组相同(除了文件)
  • 第三个参数是包含csv和编码设置的数组
  • 第四个参数是要导入的模型的类名
	$distributor = App::make('Feijs\ModelImporter\Queue\Distributor;');

	$jobs_queued = distributor->importFiles(
							'file' 	=> Input::file('files'),
							Input::except('csv', 'encoding', 'files'),
							Input::only('csv', 'encoding'),
							'Student'
						);

输出

输入验证

要获取任何验证错误(对于模型导入器输入),请调用validationErrors方法

	$importer->validationErrors()

模型验证

要获取导入过程中遇到的错误(例如,来自模型内验证的错误),请调用errors方法

	$importer->errors()

成功

要查找成功导入的数据行数,请调用getImported方法

	$importer->getImported()

自定义

模型输入缩写

默认情况下,输入应包含缩写的模型类名。要更改此设置,请覆盖getPrefix方法

	public function getPrefix()
	{
		return snake_case(class_basename(get_class($this)));	//default
	}

日期

要更改哪些属性应解析为Carbon对象,请覆盖isDateAttribute函数

	public function isDateAttribute($key)
	{
		return in_array($key, $this->getDates());				//default
	}