Выбор ответа Middle Eloquent, N+1 и миграции обновлено
Массовое обновление
Вопрос
Как пометить все просроченные черновики как архивные одним запросом?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Order::where("status", "draft")-where("createdat", "<", $cutoff)-update([...]). update на построителе запроса выполняет один UPDATE ...
Варианты ответа
foreach (Order::where(...)->get() as $o) { $o->status = "archived"; $o->save(); }Order::all()->where("status", "draft")->each->update(["status" => "archived"])DB::statement("UPDATE orders SET status = 'archived'")одной строкойOrder::where("status", "draft")->where("created_at", "<", $cutoff)->update([...])правильный ответ
Разбор
update на построителе запроса выполняет один UPDATE ... WHERE. Цикл с save() делает запрос на каждую запись (зато вызывает события моделей и мутаторы, иногда это нужно). Вариант с all() грузит всю таблицу. Сырой UPDATE без WHERE обновит все записи.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.