原则2:按选择中的类型计算项目

时间:2011-11-18 15:53:15

标签: php mysql doctrine doctrine-orm subquery

有没有人知道如何根据Doctrine 2 QueryBuilder select()语句中的条件检索计数?

这是我到目前为止所尝试的......

我的第一次尝试是使用eq()尝试count()。我收到的错误是“预期的近括号,得到了平等。”

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

接下来我尝试使用having()来计算count()。我收到的错误说“已达到最大功能嵌套级别。”

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

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

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

然后我用in()尝试了这些变化。他们都给出了语法错误“Expected FROM,got'('

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

对于in()示例,我也尝试将值作为变量传递并通过setParameter()传递,结果相同。

以下是我在QueryBuilder中尝试编码的MySQL的等价物:

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

3 个答案:

答案 0 :(得分:7)

除非您需要继续使用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

答案 1 :(得分:3)

使用查询构建器:

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

$total = $query->getSingleResult();

:)

答案 2 :(得分: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 ")