2011-11-18 43 views
6

有没有人知道如何根据Doctrine 2 QueryBuilder select()语句中的条件检索计数?学说2:按选择类型计数项目

这是我到目前为止已经试过......

我第一次尝试是试图用EQ计数()()。我收到的错误说:“期望的圆括号,等于”。

$qb->select($qb->expr()->count($qb->expr()->eq('t.id', '1'))) 

接下来我试着count()与having()。我收到的错误说:“达到最大功能嵌套级别。”

$qb->select($qb->expr()->count($qb->having('t.id', '1'))) 

然后我试着count()与where()和eq()。我再次获得了“达到最大功能嵌套级别”。

$qb->select($qb->expr()->count($qb->where($qb->expr()->eq('t.id', '1')))) 

然后我试着在()中使用这些变体。他们都给予预计将从,得到了‘(’

$qb->select($qb->expr()->count($qb->expr()->in('t.id', array(1)))) 
$qb->select($qb->expr()->count($qb->expr()->in('t.id', 1))) 

对于在()中例举的语法错误”,我也试过在价值传递作为变量,并通过的setParameter(),有相同的结果。

这是MySQL的等价的东西我想代码的QueryBuilder的:

SELECT 
    SUM(IF(type.id = 1, 1, 0)) AS 'fords', 
    SUM(IF(type.id = 2, 1, 0)) AS 'hondas' 
FROM item 
JOIN type ON item.type_id = type.id 
+4

不要忘了,你可以使用原生查询。有时它更快,更优雅。 –

回答

6

除非你需要留在DQL的事情,这可能会帮助:

public function MyAction() { 

    $this->doctrineContainer = Zend_Registry::get('doctrine'); 
    $em = $this->doctrineContainer->getEntityManager(); 

    $fords = $em->getRepository('My\Entity\Item')->findBy(array('type' => '1')); 
    $hondas = $em->getRepository('My\Entity\Item')->findBy(array('type' => '2')); 

    $fordQty = count($fords); 
    $hondaQty = count($hondas); 

} 

在一些细节:http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#by-simple-conditions

+0

谢谢弗罗格 - 我最终写了一个本地查询,但我相信这也会派上用场。 – cantera

+1

@cantera很高兴与我们分享本地查询,因为这可能对有同样问题的人有帮助。 –

2

使用查询生成器:

$query = $respository 
     ->createQueryBuilder('u') 
     ->select('count(u)') 
     ->getQuery() 
; 

$total = $query->getSingleResult(); 

:)

2

使用的QueryBuilder,请尝试:

$qb->select(" SUM(CASE WHEN t.id = 1 THEN 1 ELSE 0 END) as fords ") 
->addSelect(" SUM(CASE WHEN t.id = 2 THEN 1 ELSE 0 END) as hondas ")