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

Подсчёт связей без загрузки

Вопрос

Нужно вывести список пользователей и число их заказов. Какой вариант эффективнее?

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

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

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

Коротко

Правильный ответ: User::withCount("orders")-get() и $user-orderscount. withCount добавляет подзапрос COUNT() в основной SELECT: один запрос, заказы в память не грузятся. with загрузит все заказы всех пользователей только ради подсчёта.

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

  1. User::withCount("orders")->get() и $user->orders_countправильный ответ
  2. User::with("orders")->get() и $user->orders->count()
  3. User::all() и $user->orders()->count() в цикле
  4. User::all() и count($user->orders) в цикле

Разбор

withCount добавляет подзапрос COUNT(*) в основной SELECT: один запрос, заказы в память не грузятся. with загрузит все заказы всех пользователей только ради подсчёта. Варианты в цикле дают N+1: orders()->count() делает COUNT на каждого, а $user->orders грузит коллекцию на каждого.

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

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