2011-11-18 15 views
6

¿Alguien sabe cómo recuperar un conteo basado en una condición en una instrucción Doctrine 2 QueryBuilder select()?Doctrina 2: contar elementos por tipo en Seleccionar

Aquí es lo que he probado hasta ahora ...

Mi primer intento fue tratar de conteo() con la ecuación(). El error que recibo dice "Esperaba paréntesis cercanos, obtuve iguales".

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

Siguiente Probé count() con having(). El error que recibo dice "Nivel máximo de anidación de funciones alcanzado".

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

Luego probé count() con where() y eq(). Nuevamente obtuve el "Nivel máximo de anidación de funciones alcanzado".

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

Luego probé estas variaciones usando in(). Ambos dan el error de sintaxis "que se esperan de, consiguió '('

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

Para el paréntesis() ejemplos, también he intentado pasar en el valor como una variable y mediante setParameter(), con el mismo resultado.

Aquí es el equivalente de MySQL de lo que estoy tratando de código en 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

No se olvide, que se pueden utilizar Consultas nativas A veces es más rápido y más elegante. –

Respuesta

6

Excepto si tiene que quedarse con lo DQL, esto puede ayudar:

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

} 

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

+0

Gracias Froger - Terminé escribiendo una consulta nativa, pero estoy seguro de que esto también será útil. – cantera

+1

@cantera Sería bueno compartir con nosotros la consulta nativa ya que podría ser útil para las personas que tienen el mismo problema. –

2

Uso del generador de consultas:

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

$total = $query->getSingleResult(); 

:)

2

Usando QueryBuilder, probar:

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