Есть несколько способов приблизиться к этому. По умолчанию пакет maatwerk-excel
преобразует заголовки в слаги.
Примечание: по умолчанию эти атрибуты будут преобразованы в слаг. Вы можете изменить значение по умолчанию внутри конфигурации excel::import.heading. Доступные варианты: true|false|slugged|ascii|numeric|hashed|trans|original
True и Slugged также будут преобразованы в ASCII, если для excel::import.to_ascii задано значение true. Вы также можете изменить разделитель по умолчанию внутри конфигурации.
источник
Вы сможете обратиться к строке с помощью слага, поэтому Region
станет region
. Вы можете увидеть, есть ли настройка, которая вам подходит.
Зациклить, сопоставить и сохранить
Сложность зависит от того, есть ли у вас несколько листов или нет, вы можете просмотреть все и сохранить его в модели Eloquent для каждого поля, сопоставив его, как Марк Бейкер упомянул в комментарии к вашему вопросу. Я не знаю, загружается ли файл или вы берете его из вашей локальной файловой системы, поэтому я выбрал вариант файловой системы для своего примера:
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 (если это вообще возможно), а затем Массовое назначение ваших моделей, заменив содержимое foreach
, показанного выше, на что-то вроде:
$model = App\ImportItem::create($result->toArray());
Имейте в виду, однако, что все модели Eloquent по умолчанию защищены от массового назначения. Посмотрите документацию, чтобы узнать, хотите ли вы установить атрибуты fillable
или guarded
( Обратите внимание на упомянутое влияние безопасности). Я заметил, что иногда в некоторых файлах для импорта есть поле 0 => null
в массиве items
CellCollection
(очевидно, пустой столбец), поэтому вы также можете назвать его как
$reader->ignoreEmpty()->get()
Имейте в виду, однако, что это может привести к нежелательным результатам в других пустых полях, поэтому вы можете удалить его и другим способом.
Теперь, если вы не хотите переименовывать все столбцы в Excel, вы также можете определить мутаторы в вашей модели, но я не думаю, что это будет уместно и в данной ситуации. Пример:
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 для такого сопоставления, извините за трату вашего времени в этом случае.
person
Francesco de Guytenaere
schedule
01.03.2016