Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Múltiples consultas con Doctrine OneToMany | ManyToOne

9 de junio de 2015

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

#1

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

10 junio 2015, 12:19
#2

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

10 junio 2015, 15:47