尝试导入带有自定义标题(即人类可读)的Excel电子表格,并将其与excel导入的数据库字段进行匹配。
示例:列标题为:Region(例如North America)
数据库列标题为:region_code
知道如何使用maatwebsite/excel
包和Eloquent
模型执行此操作吗?
答案 0 :(得分:1)
有几种方法可以解决这个问题。默认情况下,maatwerk-excel
包将标头转换为slugs。
注意:默认情况下,这些属性将转换为slug。您可以更改config excel :: import.heading中的默认值。可用选项包括:true | false | slugged | ascii | numeric | hashed | trans | original
当excel :: import.to_ascii设置为true时,True和slugged也将转换为ASCII。您也可以在配置中更改默认分隔符。
您将能够通过slug来处理该行,因此Region
将成为region
。你可以看看是否有适合你的设置。
复杂性取决于您是否有多张工作表,您可以循环浏览所有内容并将其保存在每个字段的Eloquent模型上,方法是将其映射为Mark Baker在您的问题评论中提到的。我不知道文件是上传还是你从本地文件系统中获取文件,所以我为我的例子选择了文件系统选项:
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文件时,这并不是很容易维护,但是如果它们很少而且不容易改变,那么它可能是一个解决方案
另一个选项是更改Excel中的所有标题(如果这是一个选项),然后Mass Assign您的模型通过将上面显示的foreach
的内容替换为:
$model = App\ImportItem::create($result->toArray());
请注意,默认情况下,所有Eloquent模型都受到Mass Assignment的保护。查看documentation以查看是否要设置属性fillable
或guarded
(请注意所提到的安全含义)。我注意到有些文件的0 => null
数组中有一个字段items
要导入某些文件(显然是一个空列),所以你也可以这样称呼它
CellCollection
请注意,它可能会在其他空字段上产生不需要的结果,因此您也可以用其他方式删除它。
现在,如果您不想重命名Excel中的所有列,您也可以在模型中定义mutators,但我认为在这种情况下也不合适。一个例子:
$reader->ignoreEmpty()->get()
也许我一无所知地写了这一切,并且有一个更容易和更快的方式实现到包和/或Laravel本身进行这样的映射,抱歉在这种情况下浪费你的时间。