32

我有一个返回博客文章及其评论的学说查询:

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

我想将结果限制为 10 篇博文。根据 DQL 文档,setMaxResults()在获取加入集合的查询上无法正常工作(在这种情况下为注释):

如果您的查询包含指定结果限制方法的 fetch-joined 集合,则无法按预期工作。Set Max Results 限制了数据库结果行的数量,但是在 fetch-joined 集合的情况下,一个根实体可能出现在许多行中,有效地水合少于指定数量的结果。

我将如何正确限制包含 fetch-joined 集合的学说查询(在这种情况下,将结果限制为 10 篇博客文章)?

4

4 回答 4

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

于 2012-02-23T17:02:44.157 回答
3

这个存储库http://github.com/beberlei/DoctrineExtensions有一个分页器扩展,它与 fetch 连接一起工作。您必须基本上制作 3 条 SELECT 语句,所有这些都是此扩展为您完成的。

于 2011-04-12T16:40:33.587 回答
-1

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

也许搜索错误,但无法真正找到关于 paginator 对象的好的文档。反正; 为了得到结果,我使用了 getIterator 并且效果很好。

我的代码有包含 rss 链接的源和来自 rss 提要的文章的文章。所以在这个例子中,我会得到一个 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());
于 2013-05-31T11:35:23.803 回答
-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')
于 2011-04-12T15:10:52.263 回答