Doctrine2 - лимит возвращаемых связанных сущностей - PullRequest
1 голос
/ 13 января 2012

Можно ли ограничить, сколько ассоциаций будет возвращено из БД? Например, допустим, у меня есть следующие объекты:

/** @Entity */
Article {
   /** @OneToMany(targetEntity="Comments") */
   private $comments; 
   ...
}

/** @Entity */
Comments { ... }

И, перебирая коллекцию статей, я хотел бы получить только 5 последних комментариев. (может быть 100 или более). Я извлекаю коллекцию из собственного хранилища, используя QueryBuilder.

На практике я бы использовал что-то вроде этого:

$articles = $em->getRepository("Article")->findArticles($commentLimit, ...);
foreach($articles as $article) {
   foreach($article->getComments() as $comment) {
       //loop will iterate just $commentLimit times
       echo $comment->getText();
   }
}

Возможно ли это сделать в запросе на подпись?

1 Ответ

2 голосов
/ 30 января 2012

В этом конкретном случае я бы использовал

/** @Entity */
Article {
   /**
    * @OneToMany(targetEntity="Comments", fetch="EXTRA_LAZY")
    * @OrderBy({"lastModified" = "DESC"})
    */
   private $comments; 
}

@OrderBy просто сортирует извлеченные элементы по одному или нескольким атрибутам , в данном случае по дате их последнего изменения. Использование EXTRA_LAZY в коллекциях меняет их поведение, так как некоторые методы не инициализируют всю коллекцию, а только некоторые ее части. Это случай Doctrine\ORM\PersistentCollection#slice($start, $end), который вы можете использовать в своем примере, чтобы просто загрузить первые элементы:

$articles = $em->getRepository("Article")->findArticles(...);
foreach($articles as $article) {
   foreach($article->getComments()->slice(0, $commentLimit) as $comment) {
       echo $comment->getText();
   }
}

Если вы хотите получить последние 5 комментариев независимо от статьи, тогда вам следует использовать DQL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...