我有一个回复博客帖子及其评论的学说查询:
SELECT b, c FROM BlogPost b LEFT JOIN b.comments c
我想将结果限制在10篇博文中。根据DQL文档,setMaxResults()
对于获取加入集合的查询(在这种情况下为注释)无法正常工作:
如果您的查询包含fetch-joined 指定结果限制的集合 方法不能像你一样工作 期望。设置最大结果限制 数据库结果行数, 但是在fetch-joined的情况下 集合一个根实体可能 有效地出现在许多行中 保湿少于规定的 结果数量。
如何正确限制包含fetch-joined集合的doctrine查询(在这种情况下,将结果限制为10篇博文)?
答案 0 :(得分:30)
Paginate与doctrine 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文件,并为Doctrine软件包指定2.2版本。
答案 1 :(得分:3)
此存储库http://github.com/beberlei/DoctrineExtensions具有可与提取连接一起使用的分页器扩展。你必须基本上制作3个SELECT语句,所有这些扩展都适合你。
答案 2 :(得分:-1)
与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')
答案 3 :(得分:-1)
尽管这是一个旧版本,但谷歌在寻找教条左连接限制时得分很高。很快它让我寻找“学说分页器”,并坚持谷歌这是我正在寻找的(不是学说分页)我仍然有一些麻烦搞清楚如何使用它。
可能搜索错误但无法在paginator对象上找到好的文档。无论如何;为了得到我使用getIterator的结果,这很好。
我的代码包含的源包含rss链接和文章,这些文章来自rss Feed。因此,在这个例子中,我将获得一个Source及其所有文章。此代码来自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());