@runprogr

Как в laravel сделать массовый апдейт уникальными значениями?

В laravel есть метод upsert, который позволят производить массовую вставку/массовый апдейт строк уникальными значениями. Выглядит это примерно так.
DB::table('table')->upsert([
            [
                'id' => 1,
                'value' => 'value1',
            ],
            [
                'id' => 2,
                'value' => 'value2',
            ],
            [
                'id' => 3,
                'value' => 'value3',
            ],
        ], ['id']);


Каждому айдишнику присваивается свое уникальное значение. И все это массово для кучи строк.
Не знаю что там под капотом, может это все делается не одним запросом, а кучей, но все же.

Метод update не умеет в уникальные значения.
Ему можно скормить только одно значение, которое он присвоит всем строкам, удовлетворяющим условию.

Почему так, и есть ли способы через laravel (ну или сырым sql запросом) произвести массовый апдейт, каждому айдишнику присваивая уникальное значение ? Или только вариант обновлять каждую строчку отдельным запросом ?
  • Вопрос задан
  • 513 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
используйте
https://github.com/iksaku/laravel-mass-update - под капотом CASE/WHEN/THEN

сырым sql такое можно сделать через CASE/WHEN/THEN
UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
                 WHEN 2 THEN 'val2'
                 WHEN 3 THEN 'val3'
         END)
WHERE column1 IN(1, 2 ,3);


или как работает UPSERT в laravel
INSERT into `table` (id, fruit)
    VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);


в postgress вместо `ON DUPLICATE KEY UPDATE` будет `ON CONFLICT (xxx) DO UPDATE `
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы