Импорт документа Excel с заголовками, отличными от полей базы данных — Laravel 5.2

Попытка импортировать электронную таблицу Excel с пользовательскими заголовками (т.е. удобочитаемыми для человека) и сопоставить их с полями базы данных для импорта в Excel.

Пример: Заголовок столбца: Регион (например, Северная Америка)
Заголовок столбца базы данных: region_code

Любая идея, как это сделать, используя maatwebsite/excel пакет и Eloquent модель?

3

Решение

Есть несколько способов подойти к этому. По умолчанию, maatwerk-excel Пакет преобразует заголовки в слагов.

Примечание: по умолчанию эти атрибуты будут преобразованы в слаг. Вы можете изменить значение по умолчанию внутри config excel :: import.heading. Доступные варианты: true | false | slugged | ascii | числовой | хэшированный | trans | оригинал

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 реализован гораздо более простой и быстрый способ для отображения, как это, извините за трату вашего времени в этом случае.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]