获得具有某些元素的实体

时间:2012-09-13 20:48:17

标签: php symfony doctrine symfony-2.1

我有一个Book实体,它与Page实体有一个One2Many关系。我想创建一个查询,检索所有至少有一页的书籍。我做了:

       $qb = $this->getDoctrine()
        ->getRepository('AcmeDemoBundle:Book')
        ->createQueryBuilder('b');          
        ->leftJoin('b.pages','p')
        ->having($qb->expr()->gt($qb->expr()->count('p'), 0));

       $books = $qb
        ->getQuery()
        ->getResult();                

问题是,虽然有很多书都有页面,但这个查询只返回一本书。

创建的查询是:

SELECT b FROM Acme\DemoBundle\Entity\Book b LEFT JOIN b.pages p HAVING COUNT(p) > 0

对我来说很好看。知道什么可能是错的吗?

2 个答案:

答案 0 :(得分:2)

使用起来更简单

->innerJoin('b.pages','p')

而不是

->leftJoin('b.pages','p')

您不需要聚合功能。简而言之:此内连接将仅返回可与至少一个页面连接的书籍。

答案 1 :(得分:1)

您应该使用聚合函数添加groupBy。 e.g。

  $qb = $this->getDoctrine()
    ->getRepository('AcmeDemoBundle:Book')
    ->createQueryBuilder('b');          
    ->leftJoin('b.pages','p')
    ->groupBy('b.id')
    ->having($qb->expr()->gt($qb->expr()->count('p'), 0));