feijs / model-importer
直接从Excel文件导入Eloquent模型
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*
- maatwebsite/excel: ~1.3.0
Requires (Dev)
- mockery/mockery: ~0.9
- orchestra/testbench: 2.2.*
- phpunit/phpunit: 4.0.*
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
。
以下关系可以导入:HasOne
、HasMany
、BelongsTo
、BelongsToMany
。
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 }