Ограничение запроса доктрины с помощью коллекции с включенной выборкой?
У меня есть запрос доктрины, который возвращает сообщения в блоге и их комментарии:
SELECT b, c FROM BlogPost b LEFT JOIN b.comments c
Я хотел бы ограничить результаты 10 сообщениями в блоге. Согласно документации DQL, setMaxResults()
работает некорректно в запросах, которые позволяют подключиться к коллекции (комментарии в этом случае):
Если ваш запрос содержит связанную с fetch сбор с указанием предела результата методы не работают так, как вы ожидать. Установка максимального результата ограничивает количество строк результатов базы данных, однако в случае присоединения к выборке коллекции один корневой объект может появляются во многих рядах, эффективно увлажнение меньше указанного количество результатов.
Как бы я правильно ограничил запрос доктрины, который содержит коллекцию с включенной выборкой (в этом случае ограничьте результаты до 10 сообщений в блоге)?
Ответы
Ответ 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());