Ответ
Жадная загрузка (Eager Loading) — это стратегия загрузки связанных данных (например, записей из связанных таблиц) одним запросом на этапе загрузки основного объекта. Это противоположность ленивой загрузки (Lazy Loading), где связанные данные подгружаются отдельными запросами только при первом обращении к ним.
Классическая проблема N+1, которую решает eager loading:
// ЛЕНИВАЯ ЗАГРУЗКА (Проблема N+1)
$authors = Author::all(); // 1 запрос: SELECT * FROM authors
foreach ($authors as $author) {
// Для каждого автора выполняется отдельный запрос:
// SELECT * FROM books WHERE author_id = ?
echo count($author->books); // N дополнительных запросов
}
// Итого: 1 + N запросов.
Решение через жадную загрузку (в Laravel Eloquent):
// ЖАДНАЯ ЗАГРУЗКА
$authors = Author::with('books')->get(); // 2 запроса:
// 1. SELECT * FROM authors
// 2. SELECT * FROM books WHERE author_id IN (1, 2, 3, ...)
foreach ($authors as $author) {
// Данные книг уже загружены в память, новых запросов нет.
echo count($author->books);
}
// Итого: 2 запроса независимо от числа авторов.
Когда использовать:
- Когда вы заранее знаете, что связанные данные понадобятся для обработки коллекции.
- Для предотвращения проблемы N+1 и значительного повышения производительности.
Когда не использовать:
- Если связанные данные нужны лишь для少数 объектов.
- Когда работаете с глубокими или сложными связями, чтобы не загружать лишние данные и не тратить память.