@jazzus

Как массово обновить строки, не вызывая 200 тыщ запросов?

Код для преобразования
$projects=Project::orderBy('lift_at', 'desc')
            ->get()
            ->map(function ($item, $index) {
               $item['rank'] = $index + 1;
                return $item->update(['rank']);
                });

Код обновляет рейтинг после сортировки даты. У всех записей обновляется 1 поле - rank, ставится +1 по-порядку. В сети пишут про ON DUPLICATE KEY но у них там свои примеры, которые у меня не работают, а в sql инъекциях я не разбираюсь. И не хотел бы, но видимо другого способа в Ларавель нет.
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
orlov0562
@orlov0562
I'm cool!
https://laravel.com/docs/5.8/database
DB::update('update users set votes = 100 where name = ?', ['John']);


В твоем случае, лучше не обновлять rank, а использовать правильную сортировку отталкиваясь от date, тк при обновлении rank как не крути, а придется обновлять все 200к записей.

Если уж, все таки будешь обновлять все записи, то тебе нужен на ON DUPLICATE KEY, а обычные переменные в SQL, вот пример:
UPDATE tbl, (select @cnt:=0) as cnt SET rank=(@cnt:=@cnt+1)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы