Выбор ответа Senior Eloquent, N+1 и миграции обновлено

Обработка миллиона записей

Вопрос

Нужно пройти по миллиону заказов и пересчитать поле. Что выбрать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Order::lazyById(1000) или chunkById(1000, ...) по ключу. all() и get() загрузят миллион моделей в память. chunkById и lazyById читают пачками по id последний, это надёжно даже при изменении записей во время обхода. chunk с OFFSET может пропускать строки, если обновление меняет условие выборки.…

Варианты ответа

  1. Order::all() и foreach с сохранением каждой модели
  2. Order::get()->each(...) с обновлением внутри колбэка
  3. Order::lazyById(1000) или chunkById(1000, ...) по ключуправильный ответ
  4. Order::cursor() с обновлением колонки сортировки по ходу обхода

Разбор

all() и get() загрузят миллион моделей в память. chunkById и lazyById читают пачками по id > последний, это надёжно даже при изменении записей во время обхода. chunk с OFFSET может пропускать строки, если обновление меняет условие выборки. cursor() экономит память на моделях, но держит один запрос и буферизованный результат, а изменение колонки сортировки по ходу ломает обход.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.