Hola,
Llevo toda la tarde y parte de la mañana liado con esta duda. Resulta que tengo una consulta que hago desde un repositorio (Symfony2) y tiene 8 columnas que son subconsultas, pero en estas necesito un LIMIT 1 ya que pueden dar mas de un registro como resultado. Me he creado lo siguiente:
/** * Obtener historial de estados */ public function findStatusHistory() { $getSubQuery = function($code) { return $this ->getEntityManager() ->getRepository('AppBundle:TagReading') ->createQueryBuilder('tr' . $code) ->select('tr' . $code . '.readingDate') ->innerJoin('tr' . $code . '.status', 's' . $code) ->where('s' . $code . '.code = ' . $code) ->andWhere('tr' . $code . '.tag = t') ->orderBy('tr' . $code . '.readingDate', 'DESC') ->setFirstResult(0) ->setMaxResults(1) ->getDQL() ; }; return $this ->createQueryBuilder('t') ->select(array('t.code', 'h.name')) ->addSelect('(' . $getSubQuery(7) . ') AS status7') ->addSelect('(' . $getSubQuery(8) . ') AS status8') ->addSelect('(' . $getSubQuery(9) . ') AS status9') ->addSelect('(' . $getSubQuery(10) . ') AS status10') ->addSelect('(' . $getSubQuery(3) . ') AS status3') ->addSelect('(' . $getSubQuery(4) . ') AS status4') ->addSelect('(' . $getSubQuery(5) . ') AS status5') ->addSelect('(' . $getSubQuery(6) . ') AS status6') ->innerJoin('t.hotel', 'h') ->getQuery() ->getResult() ; }
El resultado que obtengo al utilizar dicho metodo es:
SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row
El problema es que cuando obtengo la subconsulta correspondiente esta no incluye ningún LIMIT
pese a que he indicado el setFirstResult
y el setMaxResults
. Entiendo que sólo funcionan cuando obtengo el resultado y no al generar el DQL, pero si hago la consulta a pelo con createQuery
y le meto el LIMIT 1
me dice que no reconoce el comando LIMIT.
Estos resultados tengo que mostrarlos en una tabla que tiene que ser así. De ahí todo ese follón que tengo montado. No veo muchas más opciones, la verdad.
A ver si podéis sacarme de dudas sobre si puedo hacer lo que quiero o me busco otra forma.
Gracias.
Un saludo.
Respuestas
¿Has probado con la función de Doctrine getOneOrNullResult()
?
@SakyaStelios