rtmatt/csvimport

快速创建CSV导入工具的软件

1.7.0 2015-12-03 20:40 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:47:26 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

加快将初始客户信息导入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_namelast_nameemail字段的users数据库表。您有一个反映以下电子表格的csv文件

alt tag

步骤 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 方法调用它。照片导入支持计划在未来版本中提供。