Как правильно сделать импорт xls в Yii2?

Уже не раз сталкиваюсь с этой задачей. Суть задачи - импорт xls файлов в базу данных.

Алгоритм:

  1. Загрузка файла (происходит быстро 1-2 секунды)
  2. Парсинг файла (аналогично быстро, 2-3 секунды)
  3. Вставка в базу (долго, 1000 запросов - около 40 секунд)

3-й пункт как правило ускорял за счет того, что не использовал ActiveRecord, а составлял массив запросов и вставку делал пачкой. Например:

$sql = [];
for ($i = 1; $i < $total; $i++) {
    $sql[] = 'update products set ....';
}
$query = Yii::$app->db->createCommand(implode(",", $sql));

Это решало проблему до того времени, пока не стала нужда использовать ActiveRecord. Объясню почему: в 3-м пункте мне надо не просто обновить данные, а проверить есть ли запись, если да - то обновить, если нет - добавить, а после этого еще сохранить отдельно переводы. То есть, для последнего действия мне нужен id товара. Пример кода:

$model = Products::findOne(['code' => 111]);
if (empty($model)) { $model = new Product(); }
// тут присваиваем данные
if ($model->save()) { 
    $translation = Translation::find()->where(['table' => 'products', 'id' => $model->id, 'field' => 'name');
    if (empty($translation)) { $translation = new Translation(); }
    // данные для перевода
}

Подскажите, как можно улучшить этот код? Или это только с настройками БД играть?


Ответы (0 шт):