导入与数据库字段不同的标题的Excel文档 – Laravel 5.2

尝试导入带自定义标题(即人类可读)的Excel电子表格,并将其匹配到Excel导入的数据库字段。

示例:列标题是:区域(例如北美)
数据库列标题是: region_code

任何想法如何使用maatwebsite/excel包和一个Eloquent模型做到这一点?

有几种方法可以解决这个问题。 默认情况下, maatwerk-excel包将标题转换为maatwerk-excel 。。

注意:默认情况下,这些属性将被转换为一个slug。 你可以在configurationexcel :: import.heading中更改默认值。 可用的选项有:true | false | slugged | ascii | numeric | hashed | trans | original

当excel :: import.to_ascii设置为true时,True和slugged也会转换为ASCII。 您也可以在configuration中更改默认的分隔符。

资源

您将能够通过slu address解决行,所以Region将成为region 。 你可以看看是否有一个适合你的设置。

循环,地图和保存

复杂性取决于您是否有多个工作表,您可以遍历所有内容并将其保存在每个字段的Eloquent模型上,方法是将其映射为Mark Ba​​ker在您的问题的评论中提到的那样。 我不知道文件是否上传,或者如果你从本地文件系统抓取它,所以我拿我的例子的文件系统选项:

 Excel::load(storage_path('app/public/excel-import.xlsx'), function($reader) { $results = $reader->get(); foreach($results as $result) { // Your model namespace here $model = new \App\ImportItem(); $model->region_code = $result->region; $model->numeric_code = $result->code; $model->testfield = $result->test_field; $model->save(); } }); 

当你有许多字段的Excel文件很多时,这不是很容易维护,但是如果它们很less,而且不容易改变,那么这可能是一个解决scheme。

质量分配

另一个select是改变Excel中的所有头文件(如果这是一个选项),然后Mass通过replace上面显示的foreach的内容,像下面这样:

 $model = App\ImportItem::create($result->toArray()); 

但请注意,默认情况下,所有Eloquent模型都受到质量保证的保护。 查看文档以查看是否要设置fillableguarded属性(请注意提到的安全含义)。 我注意到有些时候,在一些要导入的文件(显然是一个空列)的CellCollectionitems数组中有一个0 => null的字段,所以你也可以调用它

 $reader->ignoreEmpty()->get() 

请记住,它可能会给其他空的领域带来不必要的结果,所以你可以用另一种方式去除它。

现在,如果你不想重命名Excel中的所有列,你也可以在你的模型中定义mutators ,但是我认为在这种情况下也不适合。 一个例子:

 class ImportItem extends Model { protected $table = 'importitems'; protected $fillable = [ 'region_code', ]; /* * If you have a field region in the Mass Assignment * and a field region_code in your database. */ public function setRegionAttribute($value) { $this->attributes['region_code'] = $value; } // Same for each attribute! Ugh what a mess! 

也许我把所有这些都写下来了,而且在这个包中和/或Laravel本身实现映射就更容易和更快捷了,对于这种情况,很抱歉浪费你的时间。