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
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
Gracias @TsubasaAkai funciona a la perfección.
@miguelplazasr