我有一个教义查询,它返回博客文章及其评论:
SELECT b, c FROM BlogPost b LEFT JOIN b.comments c
我想将结果限制为 10 篇博客文章。根据 DQL 文档,
setMaxResults()
在获取连接集合的查询上无法正常工作(本例中的注释):
如果您的查询包含 fetch-joined 指定结果限制的集合 方法没有像你想的那样工作 预计。设置最大结果限制 数据库结果行数, 但是在 fetch-joined 的情况下 一个根实体可能的集合 有效地出现在多行中 水分含量低于规定值 结果数量。
如何正确限制包含 fetch-joined 集合的学说查询(在本例中,将结果限制为 10 篇博客文章)?
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 文件并为 Doctrine 包指定 2.2 版本。
此存储库 http://github.com/beberlei/DoctrineExtensions 有一个分页器扩展,可与 fetch join 配合使用。您基本上必须创建 3 个 SELECT 语句,此扩展将为您完成所有这些操作。
如果你使用 KnbPaginator,你只需要
config/packages/knp_paginator.yaml
knp_paginator:
page_range: 10 # number of links shown in the pagination menu (e.g: you have 10 pages, a page_range of 3, on the 5th page you'll see links to page 4, 5, 6)
default_options:
page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name
sort_direction_name: order # sort direction query parameter name
distinct: false # <<< ADD THIS LINE <<<
或者你可以这样
$paginator = $this->container->get(PaginatorInterface::class);
$paginator->paginate($query, $page, $limit, ['distinct' => false]);
尽管这是一个旧的,但在谷歌寻找左连接限制学说上得分很高。很快,它让我寻找“教义分页器”,在坚持用谷歌搜索这就是我正在寻找的东西(不是教义分页)之后,我仍然在弄清楚如何使用它方面遇到了一些麻烦。
也许搜索错误,但无法真正找到有关分页器对象的良好文档。反正;为了获得结果,我使用了 getIterator 并且效果很好。
我的代码有包含 rss 链接的源和来自 rss feed 的文章。因此,在这个示例中,我将获得一个源及其所有文章。此代码来自 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());
用查询构建器做了同样的事情,它可以工作。也许是其他问题?
$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')