Метод Upsert для добавления/обновления нескольких записей разом

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