我有一个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
对我来说很好看。知道什么可能是错的吗?
答案 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));