使用 fetch-joined 集合限制学说查询?

问题描述 投票:0回答:5

我有一个教义查询,它返回博客文章及其评论:

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

我想将结果限制为 10 篇博客文章。根据 DQL 文档,

setMaxResults()
在获取连接集合的查询上无法正常工作(本例中的注释):

如果您的查询包含 fetch-joined 指定结果限制的集合 方法没有像你想的那样工作 预计。设置最大结果限制 数据库结果行数, 但是在 fetch-joined 的情况下 一个根实体可能的集合 有效地出现在多行中 水分含量低于规定值 结果数量。

如何正确限制包含 fetch-joined 集合的学说查询(在本例中,将结果限制为 10 篇博客文章)?

doctrine limit dql
5个回答
35
投票

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 版本。


3
投票

此存储库 http://github.com/beberlei/DoctrineExtensions 有一个分页器扩展,可与 fetch join 配合使用。您基本上必须创建 3 个 SELECT 语句,此扩展将为您完成所有这些操作。


0
投票

如果你使用 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]);

-1
投票

尽管这是一个旧的,但在谷歌寻找左连接限制学说上得分很高。很快,它让我寻找“教义分页器”,在坚持用谷歌搜索这就是我正在寻找的东西(不是教义分页)之后,我仍然在弄清楚如何使用它方面遇到了一些麻烦。

也许搜索错误,但无法真正找到有关分页器对象的良好文档。反正;为了获得结果,我使用了 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());

-2
投票

用查询构建器做了同样的事情,它可以工作。也许是其他问题?

$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')
© www.soinside.com 2019 - 2024. All rights reserved.