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