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

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

17 de mayo de 2015

Continuo con mis dudas sobre consultas, en esta ocasión tengo dos entidades Persona y Proveedor. Varias personas pueden pertenecer a varios proveedores por lo que tengo una relación muchos a muchos. En la entidad proveedor tengo la siguiente propiedad:

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Person", inversedBy="provider")
 * @ORM\JoinTable(name="Provider_Person", 
 *      joinColumns={@ORM\JoinColumn(name="Person_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="Provider_id", referencedColumnName="id")})
 */
protected $contacts;

Y en la entidad persona tengo la siguiente propiedad:

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Provider", mappedBy="contacts")
 */
protected $provider;

El problema se presenta cuando quiero tener la lista de personas que tiene un proveedor así que hice la siguiente consulta DQL

$dql = 'SELECT p '
        . 'FROM AppBundle:Person p '
        . 'WHERE p.provider = :provider';
 
$query = $this->getEntityManager()->createQuery($dql)
        ->setParameter('provider', $id)

Aunque creo que la lógica es correcta, se genera el siguiente error :

[Semantical Error] line 0, col 53 near 'provider = :': Error: Invalid PathExpression. 
StateFieldPathExpression or SingleValuedAssociationField expected.

También probé con la cláusula WHERE IN y el resultado es el mismo

Les agradezco la ayuda que me puedan brindar para resolver este asunto.


Respuestas

#1

Tienes que hacer un join. Te pongo un ejemplo:

$em = $this->getEntityManager();
$query = $em->createQueryBuilder();
 
return $query->select(['person','provider'])
         ->from('AppBundle:Person', 'person')
             ->innerJoin('person.provider','provider')
         ->where($query->expr()->eq('provider.id',':id'))
         ->setParameters(['id' => $provider])
         ->getQuery()->getResult();

Saludos

@TsubasaAkai

18 mayo 2015, 1:15
#2

Gracias @TsubasaAkai funciona a la perfección.

@miguelplazasr

18 mayo 2015, 23:31