Зупинка проблеми N+1 запитів
Сторінка завантажує 10 постів. База даних робить 101 запит.
1 запит для постів. 100 запитів для авторів. Класична проблема N+1.
Рішення: Eager Loading
Використання with() для завантаження зв'язків наперед. Один запит стає двома.
Порада: Laravel Debugbar показує всі запити. Спочатку встановити його.
Коли НЕ використовувати eager loading:
- Насправді не потрібні дані зв'язків
- При роботі з одним записом (немає циклу = немає N+1)
- Зв'язок повертає величезні набори даних (може бути гірше за N+1)
Просунутий трюк:
Використовувати withCount() коли потрібна тільки кількість, а не повний зв'язок.
// ПОГАНО: 101 запит
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // Запит на кожен пост
}
// ДОБРЕ: 2 запити
$posts = Post::with('author')->get();
foreach ($posts as $post) {
echo $post->author->name; // Без додаткових запитів
}
// Завантажити декілька зв'язків
$posts = Post::with(['author', 'comments', 'tags'])->get();
// Вкладені зв'язки
$posts = Post::with('comments.author')->get();
// Потрібна тільки кількість?
$posts = Post::withCount('comments')->get();
echo $posts[0]->comments_count; // Зв'язок не завантажений