2011-12-18 25 views
40

Estoy tratando de escribir una consulta (con subconsulta) pero no sé cómo establecer un límite en mi subconsulta. Mi consulta:Establecer LIMIT con doctrine 2?

$query_ids = $this->getEntityManager() 
     ->createQuery(
     "SELECT e_.id 
     FROM MuzichCoreBundle:Element e_ 
     WHERE [...] 
     GROUP BY e_.id") 
    ->setMaxResults(5) 
    ; 

$query_select = "SELECT e 
     FROM MuzichCoreBundle:Element e 
     WHERE e.id IN (".$query_ids->getDql().") 
     ORDER BY e.created DESC, e.name DESC" 
    ; 

$query = $this->getEntityManager() 
     ->createQuery($query_select) 
     ->setParameters($params) 
    ; 

Pero -> setMaxResults (5) no funciona. No 'LIMIT' en la consulta SQL. ¿Podemos hacer LÍMITE simple con la doctrina 2?

+0

MySQL todavía no soporta 'LÍMITE Y EN/ALL/ANY/SOME subconsulta' –

Respuesta

3

Su setMaxResults ($ limit) debe establecerse en el objeto.

p. Ej.

$query_ids = $this->getEntityManager() 
    ->createQuery(
    "SELECT e_.id 
    FROM MuzichCoreBundle:Element e_ 
    WHERE [...] 
    GROUP BY e_.id") 
; 
$query_ids->setMaxResults($limit); 
+2

no funciona en mi caso. Cuando uso $ query_ids-> getDql() falta el LIMIT. – bux

+4

¿Por qué esto tiene votos ascendentes? es exactamente lo mismo que el OP pero solo agrega más asignaciones a la misma variable –

41
$query_ids = $this->getEntityManager() 
     ->createQuery(
     "SELECT e_.id 
     FROM MuzichCoreBundle:Element e_ 
     WHERE [...] 
     GROUP BY e_.id") 
    ->setMaxResults(5) 
    ->setMaxResults($limit) 
    ; 

aquí en la segunda consulta el resultado de la primera consulta se debe pasar ..

$query_select = "SELECT e 
     FROM MuzichCoreBundle:Element e 
     WHERE e.id IN (".$query_ids->getResult().") 
     ORDER BY e.created DESC, e.name DESC" 
    ; 


$query = $this->getEntityManager() 
     ->createQuery($query_select) 
     ->setParameters($params) 
     ->setMaxResults($limit); 
    ; 

$resultCollection = $query->getResult(); 
+1

Su respuesta está funcionando, es lo que uso en mi código de producción desde que hago la pregunta. Pero en mi pregunta busco establecer un LÍMITE en mi primera consulta, para usar su DQL en la segunda consulta. (y hacer solo una consulta de base de datos). – bux

+0

¿Es ese código o pseudo código válido? Cuando intento que Symfony ataque con 'Notice: Array to string conversion' puedo probar un Hydrator personalizado para devolver una matriz unidimensional e implosionar eso porque parece que ya no hay uno que lo haga: http: // docs.doctrine-project.org/en/2.1/reference/dql-doctrine-query-language.html#hydration-modes – HMR

+0

Tenga cuidado si usa JOIN en su DQL. No funcionará como se esperaba: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#first-and-max-result-items -dql-query-only –

0
$limit=5; // for exemple 

$query = $this->getDoctrine()->getEntityManager()->createQuery(
      '// your request') 

->setMaxResults($limit); 

$results = $query->getResult(); 

// Done 
+2

No solo publique código de trabajo, sino también una breve explicación y resumen de su trabajo. –

+1

LO SIENTO que es mi primera vez aquí para hacer una publicación, así que para establecer un límite debemos hacer esta función en la consulta setMaxResults ($ limit) y no olvidarnos de definir $ limit –

+0

@ Badrèddine - puedes editar tu respuesta para mejorarla . SO nos permite corregir nuestros errores, así que aproveche. – APC

14

utilizo Doctrine\ORM\Tools\Pagination\Paginator para esto, y funciona perfectamente (doctrina 2.2) .

$dql = "SELECT p, c FROM BlogPost p JOIN p.comments c"; 
$query = $entityManager->createQuery($dql) 
         ->setFirstResult(0) 
         ->setMaxResults(10); 

$paginator = new Paginator($query, $fetchJoinCollection = true); 
+0

La pregunta es cómo limitar las entidades de subconsulta, p. entidades relacionadas. –

1
$qb = $this->getDoctrine()->getManager()->createQueryBuilder(); 
$qb->select('p') ->from('Pandora\UserBundle\Entity\PhoneNumber', 'p'); 
$qb->where('p.number = :number'); 
$qb->OrWhere('p.validatedNumber=:number'); 
$qb->setMaxResults(1); 
$qb->setParameter('number',$postParams['From']); 
$result = $qb->getQuery()->getResult(); 
$data=$result[0]; 
+1

Bienvenido a StackOverflow, lea esta guía para saber cómo escribir una buena respuesta: https://stackoverflow.com/help/how-to-answer Debe agregar contexto al código y explicar cómo y por qué funciona. – Graham