Laravel массовый импорт в БД

197
17 января 2018, 17:55

Добрый день!

Коротко о системе:
laravel: 5.5
PHP: 7.0
Модуль: Apache-PHP-7
БД: MySql-5.7
ОС: Windows/Linux (тестовый/боевой)

Задача такая.
Подгружается прайс с тысячами позиций, которые необходимо забить в БД, артикул является уникальным ключем.
При первом проходе файла (уникальных артикулов) все проходит хорошо, но дело в том, что данные могут из файла в файл (временами) повторяться.
Задача заключается в том, что бы не делать тысячи запросов к БД, а одним запросом записать только уникальные данные из массива.
При обычной вставке типа

Goods::insert($dbArr);

будет возвращена ошибка т.к. некоторые ключи могут быть не уникальны.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '111120150182' for key 'goods_article_unique' (SQL: insert into `goods` (`article`,`collection`, `description`, `imageN`, `name`, `price`, `size`) values (************))

Вариант с получением всей коллекции из БД не совсем верен т.к. в БД может быть большое количество записей, сейчас около 10к может быть и и 50к товаров, а это надо понимать не корректно выбирать 50к строк из БД.

Помогите пожалуйста решить данную задачу.

Answer 1

как то так. если не нужно обновлять значения, то вы можете обновлять поле updated_at

function insertOrUpdate($table, array $rows)
{
    $first = reset($rows);
    $columns = implode(',',
        array_map(function ($value) {
            return "$value";
        }, array_keys($first))
    );
    $values = implode(',', array_map(function ($row) {
            return '(' . implode(',',
                    array_map(function ($value) {
                        return '"' . str_replace('"', '""', $value) . '"';
                    }, $row)
                ) . ')';
        }, $rows)
    );
    $updates = implode(',',
        array_map(function ($value) {
            return "$value = VALUES($value)";
        }, array_keys($first))
    );
    $sql = "INSERT INTO {$table} ({$columns}) VALUES {$values} ON DUPLICATE KEY UPDATE {$updates}";
    return \DB::statement($sql);
}

что-то вроде

return "updated_at = now()";
READ ALSO
Передать значение переменной php в js

Передать значение переменной php в js

Сайт на WordPress, задача была задать разные стили элементам взависимостри от времени суток и дня недели (с этим справился), вопрос вот в чем

219
Удалить ненужный div при парсинге

Удалить ненужный div при парсинге

Парсим таблицу и в таблице есть не нужный нам div

269
Помогите настроить аутентификацию JWT

Помогите настроить аутентификацию JWT

Есть indexhtml Там инпуты: логин, пароль и почта

271
Найти и проставить id родителей

Найти и проставить id родителей

ЗдравствуйтеИмеется таблица вида:

185