Новая функция в 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.