{% for category in categories %} {% for post in category.lastPosts %} {% for comment in post.lastComments %} {{ comment.content }} {% endfor %} {% endfor %} {% endfor %}
public function getLatestPosts()
{
$collection = $this->getPosts();
$criteria = Criteria::create()
->orderBy(["id" => Criteria::DESC])
->setFirstResult(0)
->setMaxResults(20);
return $collection->matching($criteria);
}
тот запрос, что вы привели имеет такой же недостаток :) Если вы хотите сделать одним запросом, то тут нужны пользовательские переменные. И сомневаюсь, что доктрина так умеет
Кроме того я не уверен, что вы понимаете суть гидратации.
Если вы желаете ИЗВЛЕКАТЬ данные из БД и выводить их "in View" в виде неких списков - то гидратация вам не нужна.
$query = $em->createQuery('SELECT p FROM AppBundle\Entity\Post p WHERE p.category_id IN (?1) ORDER BY p.id DESC');
$query->setMaxResults(20);
$query->setParameter(1, $categoriesIds);
$posts = $query->getResult();
вы можете получить посты только из одной категории. Так и задумано?
Ну а что касается миллионов запросов к БД, то это надо решать уже на другом уровне (например кэшированием)