Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 16.01.2018 15:11:43

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

Добрый день уважаемые форумчане!

Коротко о системе:
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 (************))

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

Изменено vnucka (16.01.2018 15:23:16)

Не в сети

#2 16.01.2018 17:12:15

Re: Массовый импорт в БД.

Код и формат данных ты не показал, поэтому на словах. Загружаешь существующие ключи, фильтруешь данные (array_filter или $collection->filter()) и вставляешь отфильтрованный массив/коллекцию. Или почитай про сырые запросы INSERT IGNORE.

Не в сети

#3 17.01.2018 02:26:06

Re: Массовый импорт в БД.

Получать все данные из таблицы не хочется т.к. на данном этапе там уже ~10к записей, а будет еще больше.
Потому и есть нужда вставлять только уникальные.
Почитал инфу по INSERT IGONRE
Пишут:

В Laravel по умолчанию insert ignore не поддерживается, здесь это обсуждалось, и господин Graham Campbell не понимает нужд разработчиков. Там же вы можете увидеть ссылку на сторонний пакет решающий эту проблему. Сам правда им не пользовался, так что отзыва оставить не могу.

Благодарю за помощь, попробую тот сторонний пакет.

Не в сети

Подвал раздела