2011-08-25 97 views
55

que tienen el código de Symfony donde se recupera todas las categorías relacionadas con una sección de blog en mi proyecto:¿Cómo seleccionar una consulta distinta utilizando el generador de consultas symfony2 doctrine?

$category = $catrep->createQueryBuilder('cc') 
    ->Where('cc.contenttype = :type') 
    ->setParameter('type', 'blogarticle') 
    ->getQuery(); 

$categories = $category->getResult(); 

Esto funciona, pero la consulta incluye duplicados:

Test Content 
Business 
Test Content 

Quiero usar el DISTINCT comando en mi consulta. Los únicos ejemplos que he visto requieren que escriba SQL sin procesar. Quiero evitar esto tanto como sea posible, ya que estoy tratando de mantener todo mi código de la misma manera, así que todos usan la función QueryBuilder proporcionada por Symfony2/Doctrine.

He intentado añadir distinct() a mi consulta como esta:

$category = $catrep->createQueryBuilder('cc') 
    ->Where('cc.contenttype = :type') 
    ->setParameter('type', 'blogarticle') 
    ->distinct('cc.categoryid') 
    ->getQuery(); 

$categories = $category->getResult(); 

Pero el resultado es el siguiente error:

Fatal error: Call to undefined method Doctrine\ORM\QueryBuilder::distinct()

¿Cómo le digo Symfony para seleccionar distinta?

+1

Usted debe estar pasando un valor booleano a la función distinta(). http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_distinct – Omn

Respuesta

22

podría escribir

select DISTINCT f from t; 

como

select f from t group by f; 

cosa es, sólo estoy actualmente yo metiendo Doctrina, por lo que no se puede dar una respuesta real. pero podría, como se muestra arriba, simular un distinto con group by y transformarlo en Doctrine. si desea agregar más filtros, use HAVING después de agrupar.

+0

@mickburkejnr Until You add an ORDER clause. :( – undefined

+0

@xyu Lo sé, no es lo ideal, ¿verdad? ¿Por qué deberíamos soportar algo como esto? ¿Por qué no puede funcionar? – mickburkejnr

+0

@mickburkejnr La agrupación ocurre antes de realizar un pedido en SQL – undefined

42

Si se utiliza la instrucción "select()", se puede hacer esto:

$category = $catrep->createQueryBuilder('cc') 
    ->select('DISTINCT cc.contenttype') 
    ->Where('cc.contenttype = :type') 
    ->setParameter('type', 'blogarticle') 
    ->getQuery(); 

$categories = $category->getResult(); 
131

esto funciona:

$category = $catrep->createQueryBuilder('cc') 
     ->select('cc.categoryid') 
     ->where('cc.contenttype = :type') 
     ->setParameter('type', 'blogarticle') 
     ->distinct() 
     ->getQuery(); 

$categories = $category->getResult(); 
Cuestiones relacionadas