Ограничение запроса доктрины коллекцией с выборкой? - PullRequest
28 голосов
/ 11 апреля 2011

У меня есть запрос доктрины, который возвращает сообщения в блоге и их комментарии:

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c

Я бы хотел ограничить результаты 10 постами в блоге. Согласно документации DQL, setMaxResults() некорректно работает с запросами, которые выбирают присоединение к коллекции (комментарии в этом случае):

Если ваш запрос содержит соединение с выборкой коллекция, определяющая предел результата методы не работают, как вы бы ожидать. Задать максимальное количество результатов ограничивает количество строк результатов базы данных, Однако, в случае с соединением с извлечением Коллекции одна корневая сущность может появляются во многих рядах, эффективно увлажняющий меньше указанного количество результатов.

Как правильно ограничить запрос доктрины, содержащий коллекцию с выборкой (в данном случае, ограничить результаты 10 сообщениями в блоге)?

Ответы [ 4 ]

30 голосов
/ 23 февраля 2012

Paginate был объединен с доктриной 2.2, а новая версия symfony2 2.0.10 совместима с.

Теперь используйте это так

//use Doctrine paginator
use Doctrine\ORM\Tools\Pagination\Paginator;

Напишите ваш запрос, затем назовите результаты так.

$query->setMaxResults($limit);
$query->setFirstResult($offset);
$results = new Paginator($query, $fetchJoin = true);

Надеюсь, это поможет вам.

Примечание. Если вы используете SF2 2.0.10, вам следует обновить файлы deps и deps.lock и указать версию 2.2 для пакетов Doctrine.

3 голосов
/ 12 апреля 2011

Этот репозиторий http://github.com/beberlei/DoctrineExtensions имеет расширение paginator, которое работает с выборочными соединениями.По сути, вы должны сделать 3 оператора SELECT, и все это расширение делает для вас.

0 голосов
/ 31 мая 2013

Несмотря на то, что это старое приложение, Google набирает высокие баллы в поисках доктрины.Вскоре он заставил меня искать «доктрина-пагинатор», и после того, как я настаивал на том, что Google это именно то, что я искал (не на доктринальную пагинацию), у меня все еще возникали проблемы с поиском способа его использования.не мог найти хорошую документацию по объекту paginator.Тем не мение;чтобы получить результаты, я использовал getIterator, и он работал нормально.

В моем коде есть источники, содержащие ссылки rss, и статьи, являющиеся статьями из ленты rss.Таким образом, в этом примере я получу один источник и все его статьи.Этот код от Symfony.

        // get the articles (latest first) from source 743
        $q=$this->getDoctrine()->getManager()
          ->createQuery('select s, a from MyCompanyRssBundle:Source s 
          join s.Articles a 
          where s.id = :id 
          order by a.id desc')
          ->setParameter('id',743);
        $q->setMaxResults(1);  // this limits Articles to be only 1
                               // when using $q->getResult();
        $sources=new Paginator($q, $fetchJoin = true);
        $sources=$sources->getIterator();
        var_dump($sources[0]->getArticles());
0 голосов
/ 12 апреля 2011

То же самое сделал с помощью querybuilder, и он работает. Может быть, в чем-то еще проблема?

$qb->add('select', 'b, c, ch, g')
   ->add('from', 'Broadcast b')
   ->add('groupBy', 'b.title')
   ->add('where', 'b.imageBig != \'\'')
   ->add('orderBy', 'b.starttime ASC')
   ->setMaxResults(10)
   ->leftJoin('b.category', 'c')
   ->leftJoin('b.channel', 'ch')
   ->leftJoin('b.genre', 'g')
...