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

时间:2011-04-11 11:45:44

标签: doctrine limit dql

我有一个回复博客帖子及其评论的学说查询:

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

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

  

如果您的查询包含fetch-joined   指定结果限制的集合   方法不能像你一样工作   期望。设置最大结果限制   数据库结果行数,   但是在fetch-joined的情况下   集合一个根实体可能   有效地出现在许多行中   保湿少于规定的   结果数量。

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

4 个答案:

答案 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());