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

can*_*era 7 php mysql doctrine subquery doctrine-orm

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

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

我的第一次尝试是使用eq()尝试count().我收到的错误是"预期的密切括号,得到了平等."

$qb->select($qb->expr()->count($qb->expr()->eq('t.id', '1')))
Run Code Online (Sandbox Code Playgroud)

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

$qb->select($qb->expr()->count($qb->having('t.id', '1')))
Run Code Online (Sandbox Code Playgroud)

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

$qb->select($qb->expr()->count($qb->where($qb->expr()->eq('t.id', '1'))))
Run Code Online (Sandbox Code Playgroud)

然后我用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)))
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

Fre*_*ger 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);

}
Run Code Online (Sandbox Code Playgroud)

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

  • 这对于许多记录来说无法扩展,因为它使用 PHP 中的大量内存来存储该数组,然后对其进行计数 (2认同)

小智 5

使用 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 ")
Run Code Online (Sandbox Code Playgroud)