Hola, un saludo a tod@s.
Tengo lo siguiente. Hace un tiempo había hecho una consulta similar consulta, en aquel entonces, tenía la misma duda. Lo solucioné de otra manera. Esta vez necesito, sí o sí, hacerlo con Joins.
Para empezar les quiero ilustrar:
Tengo 5 tablas. Tres entidades [Cursos, Modulos e Items] y dos tablas que me ayudan con las relaciones [CursosModulos, ModulosItems] de las tres entidades. Las tres entidades se relaciones OneToMany hacia las otras, creando una relación de ManyToMany.
La cuestión es que necesito hacer la siguiente consulta: Curso -> Modulo -> Item, y que return sea un QuerySingleResult. Necesito saber que los tres parámetros que se pasan están relacionados.
He intentado, sin resultados positivos crear alguna especie de Query:
return $this->getEntityManager() ->createQuery( 'SELECT c FROM AppBundle:Admin\Cursos\Cursos c INNER JOIN c.modulos m WHERE c.id = :curso AND m.modulos = :modulo ' ) ->setParameter('curso', $curso) ->setParameter('modulo', $modulo) ->getSingleResult() ;
return $this->getEntityManager() ->createQuery( 'SELECT c FROM AppBundle:Admin\Cursos\CursoModulos c WHERE c.cursos = :curso AND c.modulos = :modulo ' ) ->setParameter('curso', $curso) ->setParameter('modulo', $modulo) ->getSingleResult() ;
Espero cualquier ayuda. Les estoy agradecido. Saludos cordiales!
Respuestas
La consulta DQL debería ser más o menos así:
SELECT curso, modulo, item FROM AppBundle:Admin\Cursos\Cursos curso JOIN curso.modulos modulo JOIN modulo.items item WHERE curso.id = XXX AND modulo.id = YYY
@javiereguiluz
Gracias Javier. Mi solución fue la siguiente.
$repositorio = $em->getRepository('Bundle:Admin\Cursos\Cursos'); $curso = $repositorio->createQueryBuilder('c') ->select('c','cm','m','i') ->leftJoin('c.modulos','cm') ->leftJoin('cm.modulos', 'm') ->leftJoin('m.items','i') ->where('c.id = :curso') ->andWhere('cm.modulos = :modulo') ->andWhere('i.items = :item') ->setParameter('curso', $curso) ->setParameter('modulo', $modulo) ->setParameter('item', $item) ->getQuery() ->getResult() ;
Saludos!
@cristian_angulo