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

Массовое обновление

Вопрос

Как пометить все просроченные черновики как архивные одним запросом?

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

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

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

Коротко

Правильный ответ: Order::where("status", "draft")-where("createdat", "<", $cutoff)-update([...]). update на построителе запроса выполняет один UPDATE ...

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

  1. foreach (Order::where(...)->get() as $o) { $o->status = "archived"; $o->save(); }
  2. Order::all()->where("status", "draft")->each->update(["status" => "archived"])
  3. DB::statement("UPDATE orders SET status = 'archived'") одной строкой
  4. Order::where("status", "draft")->where("created_at", "<", $cutoff)->update([...])правильный ответ

Разбор

update на построителе запроса выполняет один UPDATE ... WHERE. Цикл с save() делает запрос на каждую запись (зато вызывает события моделей и мутаторы, иногда это нужно). Вариант с all() грузит всю таблицу. Сырой UPDATE без WHERE обновит все записи.

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

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