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

Cómo hacer una consulta en una relación Many to Many de Doctrine

20 de diciembre de 2015

Muchas gracias de antemano por las respuestas. Estoy estudiando ingeniería informática y me han mandado hacer un proyecto con symfony. Me han surgido unas dudas al hacer consultas en las relaciones many to many. Tengo dos entidades, personaje y película. Un personaje puede estar en muchas películas y una película tiene muchos personajes(many to many). En la entidad personaje tengo el siguiente código:

/**
 * @ORM\ManyToMany(targetEntity="pelicula", inversedBy="personajes")
 *  @ORM\JoinTable(name="personajes_peliculas",
 *      joinColumns={ @ORM\JoinColumn(name="id_personaje", referencedColumnName="id")},
 *      inverseJoinColumns={ @ORM\JoinColumn(name="id_pelicula", referencedColumnName="id")}
 *      )
 */
protected $pelicula;

En la clase pelicula tengo:

/**
* @ORM\ManyToMany(targetEntity="personaje", mappedBy="pelicula")º
*/
protected $personajes;

El problema lo tengo al hacer una consulta. Quiero obtener el listado de los personajes que han aparecido en una película determinada, para ello dispongo del ID de la película en cuestión; paso ese ID en los parámetros del método. La consulta que hago en el controler es así.

public function mostrarPeliculasPersonajesAction($id)
{
 
    return $personaje = $this->get('doctrine')->getManager()->createQueryBuilder()
                 ->select('p')
                 ->from('BlogBundle:personaje', 'p')
                 ->innerJoin('p.pelicula', 'pelicula')
                 ->where($query->expr()->eq('pelicula.id', ':id'))
                 ->setParameters(['id' => $id])
                  ->getQuery()->getResult();
}

La verdad es que no se que puede ser, no controlo mucho las many to many y creo que he metido la pata en algún punto de la consulta. No se si es que tengo que usar la tabla intermedia que se genera la entidad personaje al poner la relación many to many. Siento si el código esta poco claro, he intentado hacer una captura de pantalla y ponerla pero no he sabido ponerla en el check-box de la descripción. Muchas gracias a todo el mundo que pueda ayudar y siento las molestias.

Muchas gracias cristian, he puesto tu código, quedando de la siguiente manera el método:

public function mostrarPeliculasPersonajesAction($id)
{
 
      $pelicula = $this->get('doctrine')->getManager()->createQueryBuilder()
             ->select('p')
             ->from('BlogBundle:pelicula', 'p')
             ->where('p.id = :id')
             ->setParameters(['id' => $id])
             ->getQuery()->getResult();
 
     return $pelicula->getPersonajes();
 
}

El problema es que al cargar la pagina me da el siguiente problema:

Error: Call to a member function getPersonajes() on array

He intentado llamar con un array, cambiando el return de esta manera:

return array('personaje' => $pelicula->getPersonajes());

El fallo que me da es el mismo.


Respuestas

#1

Hola @LonsoBorja. Sería bueno ver qué error te anda saliendo.

Por ahora, has la consulta de la siguiente manera...

public function mostrarPeliculasPersonajesAction($id)
{
 
   $pelicula = $this->get('doctrine')->getManager()->createQueryBuilder()
                 ->select('p')
                 ->from('BlogBundle:Pelicula', 'p')
                 ->where('p.id = :id')
                 ->setParameters(['id' => $id])
                 ->getQuery()->getResult();
 
   return $pelicula->getPersonajes()
}

Saludos!

@cristian_angulo

20 diciembre 2015, 4:21