Операции обновления Laravel с помощью Query Builder

В одном из моих рабочих сценариев для хранения совокупных подсчетов на основе некоторых показателей я не использую Eloquent, поскольку запросы немного сложны и их легко написать с помощью построителя запросов. В настоящее время я получаю значения из базы данных, и мне нужно вставить / обновить их в базе данных. Можно ли выполнить операцию upsert с помощью метода save () с помощью Query Builder? Или мне нужно каждый раз проверять, есть ли эта запись в базе данных?

У меня есть в общей сложности 100 000 записей, и я хотел бы выполнять это как ежедневную работу. Поэтому, если мне нужно проверить, есть ли конкретная запись в БД, мне нужно много раз обращаться к базе данных. Есть ли альтернативное решение для этого?

Я думаю о создании двух классов моделей, один с использованием Eloquent и один с помощью построителя запросов. Могу ли я использовать свой собственный запрос в модели Eloquent?


person Happy Coder    schedule 10.06.2016    source источник


Ответы (3)


Теперь (6 октября 2020 г.) Laravel (v8.10.0) имеет встроенную поддержку upsert. https://github.com/laravel/framework/pull/34698

DB::table('users')->upsert([
    ['id' => 1, 'email' => '[email protected]'],
    ['id' => 2, 'email' => '[email protected]'],
], 'email');
person baijunyao    schedule 25.11.2020
comment
Спасибо за проверку. Я задавал этот вопрос 4 года назад. - person Happy Coder; 25.11.2020

У Eloquent есть updateOrCreate() метод, который позволяет вам делать именно то, что вы хотите. Но в Конструкторе запросов нет аналогичного метода.

Вы можете создать необработанный запрос с помощью Query Builder и использовать INSERT .. . ON DUPLICATE KEY UPDATE в качестве решения для обновления.

person Alexey Mezenin    schedule 10.06.2016
comment
Имейте в виду, что updateOrCreate не так атомарен, как SQL upsert: - person Alex Blex; 01.11.2017
comment
Я создал пакет UPSERT для всех баз данных: github.com/staudenmeir/laravel-upsert - person Jonas Staudenmeir; 27.05.2019

В Eloquent есть метод updateOrCreate, который можно использовать, как в этом примере:

<?
$flight = Flight::updateOrCreate(
    [
       'code' => '156787', 
       'destination' => 'COL'
    ],
    [
       'code' => '156787', 
       'destination' => 'COL',
       'price' => 99, 
       'discounted' => 1,
    ],
);
  1. Поиск по code и destination поможет вам лучше идентифицировать ваши строки.
  2. Он создает или обновляет в соответствии со значениями, указанными во втором массиве.

Следующее - признак метода.

/**
 * Create or update a record matching the attributes, and fill it with values.
 *
 * @param  array  $attributes
 * @param  array  $values
 * @return \Illuminate\Database\Eloquent\Model
 */
public function updateOrCreate(array $attributes, array $values = [])
person Oscar Gallardo    schedule 01.09.2020