2011-11-18 8 views
6

Qualcuno sa come recuperare un conteggio in base a una condizione in una istruzione select() di QueryBuilder Doctrine 2?Doctrine 2: conta elementi per tipo in Seleziona

Ecco quello che ho provato finora ...

Il mio primo tentativo è stato quello di provare count() con eq(). L'errore che ricevo dice "Sono previste parentesi chiuse, uguali."

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

Successivamente ho provato count() con avere(). L'errore che ricevo dice "Raggiunto il livello massimo di nidificazione delle funzioni."

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

Quindi ho provato count() con where() ed eq(). Ancora una volta ho ottenuto "Massimo livello di nidificazione della funzione raggiunto".

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

Quindi ho provato queste variazioni utilizzando in(). Entrambi danno l'errore di sintassi "ci si aspetta da, ottenuto '('

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

Per l'in() esempi, ho provato anche passando il valore come una variabile e tramite setParameter(), con lo stesso risultato.

Qui è l'equivalente di MySQL di quello che sto cercando di codice 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

Non dimenticate, che è possibile utilizzare Query native. A volte è più veloce e più elegante. –

risposta

6

a meno che non avete bisogno di stare con la cosa DQL, questo può aiutare:

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); 

} 

Alcuni dettagli su: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#by-simple-conditions

+0

Grazie Froger - Ho finito per scrivere una query nativa, ma sono sicuro che questo sarà utile. – cantera

+1

@cantera Sarebbe bello condividere con noi la query nativa come potrebbe essere utile per le persone che hanno lo stesso problema. –

2

Utilizzo del generatore di query:

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

$total = $query->getSingleResult(); 

:)

2

Utilizzando QueryBuilder, provare:

$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 ")