rtmatt / csvimport
快速创建CSV导入工具的软件
Requires
- php: >=5.5.9
Requires (Dev)
- orchestra/testbench: ~3.0
- phpspec/phpspec: ~2.1
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-14 18:47:26 UTC
README
加快将初始客户信息导入MySQL数据库驱动CMS的过程。此软件包包含您需要开始导入CSV到数据库的所有内容。它是可配置和可扩展的,以便实现复杂的导入逻辑。
要求
- php >=5.5
- Laravel 5.1应用程序
- MySQL数据库
- 服务器可写、mysql用户可读的目录。
安装
安装软件包
$ composer require rtmatt/csvimport
在config/app.php中将服务提供者添加到应用程序路由服务提供者之前
//... RTMatt\CSVImport\Providers\CSVImportServiceProvider::class, //... App\Providers\RouteServiceProvider::class,
发布软件包提供者
$ php artisan vendor:publish --provider="RTMatt\CSVImport\Providers\CSVImportServiceProvider"
使用方法
基本使用示例
背景
您有一个包含first_name、last_name和email字段的users数据库表。您有一个反映以下电子表格的csv文件
步骤 1 - 创建导入器
创建导入器。以下将创建导入器存根 app/CSVImports/UsersImporter.php
$ php artisan csvimport:make Users
这将创建导入器存根 app/CSVImports/UsersImporter.php
步骤 2 - 配置导入器
配置导入器存根。您需要定义以下方法。
<?php namespace App\CSVImports; use RTMatt\CSVImport\CSVImportImporter; class UsersImporter extends CSVImportImporter { protected function setResourceName() { return "users"; //this string defines the name for files generated by the importer. } protected function setTableName() { return "users"; //this need to be the name of the table the importer imports into } protected function setFieldString() { return "first_name,last_name,email"; //the corresponding database fields for each column in the csv } }
步骤 3 - 上传导入器并运行
导航到 /csv-imports。您应该看到与您创建的导入器相对应的输入。上传您的csv文件并点击提交。
步骤 4 - 休息一下
您应该放松一下。
配置选项
在安装过程中,软件包将创建一个包含以下选项的配置文件 config/csvimport.php
'import_order'=>[], //define order in which importers run 'auth'=>false, // require authentication 'sql_directory'=>'/data', // directory that csv files are written to and read from 'override_layout_view'=> false, // override layout with custom view 'importer_directory'=>app_path('CSVImports'), // directory in which new importers are saved 'importer_namespace'=>"\\App\\CSVImports\\", // namespace of importers for creation and running 'custom_route'=>false //custom route for Import manager
导入顺序
如果您有需要按特定顺序运行的导入器,请设置此配置选项。
例如,您在导入器目录中有以下内容
AffiliatesImporter.php
UsersImporter.php
UserPhotosImporter.php
如果您需要在AffiliatesImporter之前运行UserPhotosImporter,您将定义import_order配置数组如下
'import_order'=>[ 'user_photos'=>0 'affiliates'=>1 ],
- 数组键是导入器的snake_case名称,去掉'Importer'
- 数组值是操作的升序顺序
- 不需要排序的导入器不需要包括在内。它们将在有序导入器完成后运行。
身份验证
如果您想要要求对导入器进行身份验证,请将auth配置设置为true
为了使用身份验证,您需要在您的User模型中添加以下内容
public function can_import() { // your permission logic here // return true|false }
- 当未经验证的用户尝试访问导入区域时,将抛出Unauthorized HttpException。
- 当返回false的can_import方法的认证用户尝试访问时,将抛出Forbidden HttpException。
SQL目录
您可以配置导入器写入和从读取文件的目录。此目录需要由服务器可写并由mysql用户可读。如果您覆盖此设置,请使用绝对路径。
'sql_directory'=>'/home/users/jondoe/sql_store',
覆盖视图
如果您希望在导入器加载的admin布局中,只需将override_layout_view配置更改为表示如何在控制器中加载视图的字符串
'override_layout_view'=> 'layouts.admin'
布局将通过软件包的控制器加载。如果您有未正确处理的布局变量或逻辑,您可能会遇到错误。
覆盖导入器目录
如果您希望将导入器存储在其他位置而不是app/CSVImports,您可以通过更改importer_directory配置来实现。
请确保更新 importer_namespace 配置,以确保正确的导入器加载。
'importer_directory'=>app_path('IWantMyImportersHereForReasons'), 'importer_namespace'=>"\\App\\IWantMyImportersHereForReasons\\",
自定义路由
如果您不喜欢 /csv-imports 路由,并希望定义自己的路由,您可以通过修改应用程序的 routes.php 文件,使用该包的控制器来设置控制器路由来实现。
Route::controller([your preferred route here],'\RTMatt\CSVImport\CSVImportController');
您还应将 custom_route 配置设置为 true,以确保默认包路由不会被注册。
高级用法
在预定义的某些点上,您可以扩展导入器的功能。
覆盖导入命令
您可以通过定义此方法来完全覆盖导入器运行的 MySQL 命令。
protected function overrideImportCommand() { $statement = "[...]";//Your sql statement return $statement; }
示例:您正在将属性导入到数据库中。您正在处理的 CSV 文件存在以下问题
- 名称列有时包含回车符 ('\r')
- transaction_date 字段具有日期数据类型,但 CSV 包含日期字符串
- 属性类型列对应于子资源。您需要获取匹配属性类型名称的属性类型表中行的 id。
- 值数据类型是整数,但 CSV 包含 '$xxx,xxx,xxx' 字符串值。
protected function overrideImportCommand() { return "load data infile '/data/properties.csv' into table properties FIELDS TERMINATED BY ',' optionally ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\n' IGNORE 2 LINES (@name,city,state,@transaction_date,@property_type,description,proposition,solution,@value) set transaction_date = STR_TO_DATE(@transaction_date,'%c/%e/%Y'), property_type_id = (Select id from property_types where name = Replace(@property_type,'\r','')), value = cast((Replace(Replace(@value,'$',''),',','')) as unsigned), name=Replace(@name,'\r','') ;"; }
导入后逻辑
有时您需要在执行 SQL 语句后运行一些逻辑。您可以通过向您的导入器添加以下方法来完成此操作
protected function postSQLImport() { // post import logic here }
示例
- 您有一个包含 first_name 和 last_name 列的 Users.csv 文件。
- 您数据库中有一个 full_name 列,并希望自动填充导入用户的姓名。
protected function postSQLImport() { $users = \App\User::all(); foreach($users as $user){ $user->full_name = $user->first_name.' '.$user->last_name; $user->save; } }
故障排除
路由不工作
您可能有缓存的路线。通过运行以下命令清除路线缓存
$ php artisan route:clear
照片
目前,您需要编写自己的照片导入逻辑,并从导入器中的 postSQLImport 方法调用它。照片导入支持计划在未来版本中提供。