Выбор ответа Middle Eloquent, N+1 и миграции спрашивают часто обновлено
Подсчёт связей без загрузки
Вопрос
Нужно вывести список пользователей и число их заказов. Какой вариант эффективнее?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: User::withCount("orders")-get() и $user-orderscount. withCount добавляет подзапрос COUNT() в основной SELECT: один запрос, заказы в память не грузятся. with загрузит все заказы всех пользователей только ради подсчёта.
Варианты ответа
User::withCount("orders")->get()и$user->orders_countправильный ответUser::with("orders")->get()и$user->orders->count()User::all()и$user->orders()->count()в циклеUser::all()иcount($user->orders)в цикле
Разбор
withCount добавляет подзапрос COUNT(*) в основной SELECT: один запрос, заказы в память не грузятся. with загрузит все заказы всех пользователей только ради подсчёта. Варианты в цикле дают N+1: orders()->count() делает COUNT на каждого, а $user->orders грузит коллекцию на каждого.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.