Laravel: Eloquent и N+1
Загружайте нужные связи списком и ограничивайте размер выдачи.
Проверено Изменено
Плохо
foreach (Order::all() as $order) {
echo $order->customer->name;
}
Хорошо
$orders = Order::with('customer')->paginate(30);
foreach ($orders as $order) {
echo e($order->customer->name);
}
Почему это важно
Ленивая загрузка связи внутри цикла может добавлять запрос на каждую запись.
Когда применять
Laravel 12.x; связь customer объявлена и обязательна. Фильтр доступа к заказам добавляется до paginate. Не загружайте все связи без необходимости.
Кто что делает
Человек
Выбирает нужные колонки и размер страницы.
AI-агент
Добавляет eager loading, измеряет SQL-запросы на нескольких размерах выборки.
Пример применения
Экран менеджера показывает 30 заказов и имена клиентов. Основная выборка и выборка клиентов выполняются отдельно, без 30 дополнительных запросов.
Как проверить у себя
- Количество SQL-запросов не растёт линейно с количеством строк.
- Пагинация и фильтр доступа проверены.
Первоисточники
История изменений на GitHubДата проверки отражает содержательную сверку. Синхронизация сайта не обновляет её автоматически.