2013-09-16 1 views
2

Как я могу подсчитать строки в запросе с предложением HAVING?Doctrine - строки COUNT, когда используется предложение 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); 

Я хочу дополнительно подсчета строк, СТГ, как: (Althought, что вызывает Error: Class «(» является не определен):

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.

ответ

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 
); 
2

Использование предложил РЕФАЛ В статье, я сумел сделать это в 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(); 

Может быть упрощено?