Subquery Selects - уникаємо N+1 без eager loading
Потрібен останній пост користувача? Eager loading витягне ВСІ пости.
Subquery-select дозволяє додати обчислювану колонку без завантаження зв'язку.
Коли використовувати:
- Останній/перший пов'язаний запис
- count/sum/max/min по зв'язку
- Коли не потрібні повні дані зв'язку
Продуктивність:
Один запит. Ніякого N+1. Немає зайвих даних.
// ПОГАНО: вантажимо всі пости, щоб узяти останній
$users = User::with('posts')->get();
foreach ($users as $user) {
echo $user->posts
->sortByDesc('created_at')->first()->title;
}
// ДОБРЕ: subquery - тільки заголовок останнього поста
$users = User::select('users.*')
->addSelect(['last_post_title' => Post::select('title')
->whereColumn('user_id', 'users.id')
->latest()
->limit(1)
])->get();
echo $users[0]->last_post_title;
// Сортування по subquery - без завантаження постів
$users = User::orderByDesc(
Post::select('created_at')
->whereColumn('user_id', 'users.id')
->latest()
->limit(1)
)->get();