Doctrine — COUNT строк при использовании предложения 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.


person Jacek Kaniuk    schedule 16.09.2013    source источник


Ответы (2)


Попробуй это:

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
);
person Rafał Mnich    schedule 16.09.2013

Используя предложение 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();

Можно ли упростить?

person Jacek Kaniuk    schedule 16.09.2013