Laravel Upsert — это метод, который позволит вставить или обновить большое количество записей в базу данных одним запросом. Это действительно очень полезный метод для работы с большими объемами данных при разработке WEB приложений малых и средних уровней сложности.
При этом, метод Upsert в Ларавель достаточно прост в использовании и весьма эффективен для решения задач по импорту большого объема данных в MySQL или PostgreSQL. Важно понимать, что Upsert — это метод класса Illuminate\Database\Query\Builder, поэтому разработчику не нужно беспокоиться о том, с какой БД он работает и о других тонкостях. Достаточно просто передать необходимый набор данных в этот метод, и Laravel самостоятельно выполнит всю остальную работу.
Инструкция: как использовать Upsert на практике
Метод upsert можно вызывать непосредственно на Модели как статический метод, и передавать необходимые параметры. В примере ниже мы передаем следующие аргументы в метод:
- $data — это массив данных, которые необходимо вставить или обновить в БД
- $uniqFieldsArray — это массив наименований полей в таблице БД, на основе которых будет выполняться поиск уже существующих записей/строк.
- $fieldsForUpdate — это массив наименований полей в таблице БД, которые будут обновляться для тех строк, которые уже существуют в БД.
Model::upsert(
$data,
$uniqFieldsArray,
$fieldsForUpdate
);
Массовое обновление строк в MySQL на Laravel — реальный пример простыми словами
Предположим, мы разрабатываем приложение для спортивных соревнований. Нам необходимо добавить в БД множество Результатов с временем финиша. Время финиша измеряется в секундах. При этом, мы знаем, что Результат — это уникальная строка в БД для каждого Участника на каждом Забеге в рамках Мероприятия. Иными словами, Участник может участвовать в нескольких Забегах в рамках каждого Мероприятия. И для одного такого Забега на Мероприятии Участник может иметь только по одному Результату.
В таком случае, чтобы импортировать данные из внешнего источника следует использовать примерно следующий код.
Result::upsert(
[
[1, 2, 3, 610],
[2, 4, 6, 720],
[3, 6, 9, 830],
],
['camp_id','race_id', 'player_id'],
['camp_id','race_id', 'player_id', 'finish_time']
);
Важный момент. Чтобы этот код выше работал корректно, необходимо создать уникальный составной индекс с помощью миграции Laravel по тем полям, которые переданы во втором аргументе — $uniqFieldsArray.
Почему UPSERT работает эффективнее построчного обновления данных?
Метод upsert выполняет обновление или создание строк в базе данных (MySQL или PostgreSQL) одним запросом к БД. К примеру, мы можем обновить тысячу строк одним запросом вместо использования последовательных тысячи запросов к БД.
Часто новички и неопытные разработчики для обновления сотни Заказов выполняют сотню запросов к Базе данных. Это приводит к высокой нагрузке на сервере и долгому выполнению этого процесса.
Опытные разработчики уже знают, что именно работа с Базой Данных зачастую является «узким горлышком» при работе систем на сервере. К примеру, для выполнения каждого запроса к БД, сначала необходимо установить соединение с этой Базой — это требует определенного времени. Если же БД располагается на удаленном сервере, то это еще издержки на выполнение сетевого соединения. К тому же, на выполнение каждого запроса требуются ресурсы самого сервера, в частности работы процессора. Если мы выполняем множество запросов к БД, то на обработку этих запросов потребуется относительно больше ресурсов сервера, чем на выполнение одного запроса, пусть и с бОльшим содержанием данных.
Таким образом, снижая количество обращений к Базе данных, мы снижаем потребление ресурсов сервера и получаем более эффективную работу нашего приложения в целом и отдельным компонентов в частности.
Более подробная информация доступна в документации Laravel
Вермутофф