Обмеженням у with() - з Laravel 11 limit() усередині працює для кожного батька окремо.
$posts = Post::with([
'comments' => fn ($query) => $query->latest()->limit(3),
])->paginate(20);
Чому це не було очевидно: жадібне завантаження - це один запит WHERE post_id IN (...) для всіх постів. Звичайний LIMIT 3 обрізав би весь результат до трьох коментарів на всю сторінку. Тепер Eloquent будує запит з віконною функцією (ROW_NUMBER() OVER (PARTITION BY post_id ...)), і кожен пост отримує свої три. У старіших версіях для цього брали пакет eager-limit або окремий запит на кожен пост.
Що ще варто обмежувати в жадібному завантаженні:
- колонки -
with('author:id,name'), обов'язково разом з ключем зв'язку; - умову - лише схвалені коментарі, лише активні товари.
Альтернативи, коли кількість потрібна в іншій формі:
- лише один запис - зв'язок
latestOfMany(); - лише число -
withCount(); - дуже великі вкладені дані - окремий ендпойнт з пагінацією, а не все одразу.
Віконні функції потрібні від бази: MySQL 8+, PostgreSQL, SQLite 3.25+.