Doctrine - 使用HAVING子句时的COUNT行

时间:2013-09-16 11:37:29

标签: php count doctrine-orm doctrine having

如何使用HAVING子句计算查询中的行?

我有一个查询来获取如下所示的分页数据(但稍微复杂一些):

$qb = $this->em->createQueryBuilder()
    ->select('p')
    ->from('Application\Entity\Modules_ProductVersions', 'p', 'p.id')
    ->leftJoin('p.stocks', 's')
    ->groupBy('p.id')
    ->having('SUM(s.stock) > 0');
$qb->setMaxResults($limit)
    ->setFirstResult($page * $limit);

我想额外计算行数,例如:(虽然触发错误:类'('未定义):

SELECT COUNT(x) FROM (
SELECT p.id
FROM Application\Entity\Modules_ProductVersions p
LEFT JOIN p.stocks s
GROUP BY p.id
HAVING SUM(s.stock) > 0
) x

如何使用已构建的查询轻松完成此操作?

我使用生成的SQL来管理它:

foreach($query->getParameters() as $param) {
    $params[] = $param->getValue();
};
$count = $this->em->getConnection()->fetchColumn(
    'SELECT COUNT(i) FROM ('.$query->getSQL().') i',
    $params
);

但我更喜欢一些QueryBuilder或至少是DQL方法。

2 个答案:

答案 0 :(得分:3)

试试这个:

SELECT count(p1.*) 
FROM Application\Entity\Modules_ProductVersions p1 
WHERE p1.id IN (
    SELECT p.id
    FROM Application\Entity\Modules_ProductVersions p
    LEFT JOIN p.stocks s
    GROUP BY p.id
    HAVING SUM(s.stock) > 0
);

答案 1 :(得分:2)

使用RefałIN子句建议,我已经设法在QueryBuilder中执行此操作:

$count = $this->em->createQueryBuilder()
    ->select('COUNT(x)')
    ->from('Application\Entity\Modules_ProductVersions', 'x')
    ->where($qb->expr()->in('x.id', $qb->getDQL()))
    ->setParameters($qb->getParameters())
    ->getQuery()->getSingleScalarResult();

可以简化吗?