2011-11-18 67 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 ")