Как правильно сделать импорт xls в Yii2?
Уже не раз сталкиваюсь с этой задачей. Суть задачи - импорт xls файлов в базу данных.
Алгоритм:
- Загрузка файла (происходит быстро 1-2 секунды)
- Парсинг файла (аналогично быстро, 2-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(); }
// данные для перевода
}
Подскажите, как можно улучшить этот код? Или это только с настройками БД играть?