Подтвердить что ты не робот

Ограничение запроса доктрины с помощью коллекции с включенной выборкой?

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

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

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

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

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

4b9b3361

Ответ 1

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.

Ответ 2

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

Ответ 3

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

$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')

Ответ 4

Несмотря на то, что это старый, этот показатель очень высок в 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());