Новая функция в Laravel, которая позволит вам удобно обновить или синхронизировать большой объем данных одним запросом.
Метод Upsert делает insert записей, которых нет в базе и update для тех, что есть. Например, у нас есть таблица books c книгами.

В ней всего три поля, хотя в реальной жизни их может быть гораздо больше. Обратите внимание, что поля name и author должны быть unique.
Теперь нам нужно добавить несколько записей в эту таблицу. Но, если в ней уже есть такие авторы и книги, то для них только обновить поле quantity. Здесь нам и пригодится метод upsert:
DB::table('books')->upsert([
[
'name' => 'J.K. Rowling',
'author' => 'Harry Potter',
'quantity' => 15
],
[
'name' => 'Cal Newport',
'author' => 'Deep Work',
'quantity' => 20
]
], ['name', 'author'], ['quantity']);
Как видите, метод upsert принимает три аргумента:
- Первый аргумент состоит из значений, которые нужно вставить или обновить.
- Второй аргумент перечисляет поля, которые однозначно идентифицируют записи ( в нашем случае это
nameиauthor) в таблице. - Третий аргумент — это массив полей, которые следует обновить, если соответствующая запись уже есть в базе данных. В нашем случае мы хотим обновить
quantity.
Итак, комбинация «J.K. Rowling» и «Harry Potter» уже существует в таблице books, поэтому наш запрос upsert обновит таблицу books до такого варианта:

В комбинации «J.K. Rowling» и «Harry Potter» изменилось поле quantity. И добавилась новая запись с комбинацией «Cal Newport» и «Deep Work».
Автор: Amit Merchant
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.
