¿Establecer LÍMITE con la doctrina 2?

3 minutos de lectura

avatar de usuario de bux
bux

Intento escribir una consulta (con subconsulta) pero no sé cómo establecer un límite en mi subconsulta. mi consulta:

$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 ->establecerResultadosMax(5) no funciona No LIMIT en la consulta SQL. ¿Podemos hacer un LÍMITE simple con la doctrina 2?

  • MySQL aún no es compatible con ‘LIMIT & IN/ALL/CUALQUIERA/ALGUNAS subconsultas’

    – Serhii Smirnov

    7 de noviembre de 2016 a las 16:14

  • enlace de prueba para ‘doctrine NO es compatible limit en subqyery‘ es : github.com/doctrine/orm/issues/3979 ¡así que use la consulta sql directa nativa!

    – Vladimir Ch.

    18 abr 2019 a las 20:57

$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 se debe pasar el resultado de la primera consulta..

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

  • Su respuesta está funcionando, es lo que uso en mi código de producción desde que hice 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

    11 de abril de 2012 a las 14:48

  • ¿Es ese código válido o pseudocódigo? Cuando intento que Symfony falle con Notice: Array to string conversion Puedo probar un Hydrator personalizado para devolver una matriz unidimensional e implosionar eso porque no parece haber uno ya construido que haga eso: docs.doctrine-project.org/en/2.1/reference/…

    – HMR

    19 de junio de 2014 a las 2:46

  • Tenga cuidado si usa JOIN en su DQL. No funcionará como se esperaba: docs.doctrine-project.org/projects/doctrine-orm/en/latest/…

    – Alejandro Fiore

    16/09/2015 a las 21:15

Avatar de usuario de Oskar
Óscar

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

  • La pregunta es cómo limitar las entidades de subconsulta, por ejemplo, entidades relacionadas.

    – Serhii Smirnov

    7 de noviembre de 2016 a las 16:15

Su setMaxResults($límite) 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);

  • No funciona en mi caso. Cuando uso $query_ids->getDql() falta el LÍMITE.

    – bux

    11 de abril de 2012 a las 14:46

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

    – Mathijs Seger

    7 de noviembre de 2014 a las 11:05

Avatar de usuario de Badrèddine
Badrèddine

$limit=5; // for exemple

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

->setMaxResults($limit);

 $results = $query->getResult();

// Done

avatar de usuario de ajay singh
ajay singh

Puedes hacer esto:

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

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

    –Graham

    11 de agosto de 2017 a las 11:47

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

    –Graham

    11 de agosto de 2017 a las 11:47

¿Ha sido útil esta solución?