Hola buenas,
Quiero crear una consulta de una relación de muchos a muchos auto-referenciada. Dada la entidad Post con una propiedad llamada translations genera una tabla con una doble asociación a Post
class Post { ... /** * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Post") * @ORM\JoinTable(name="post_translations", * joinColumns={@ORM\JoinColumn(name="post_a_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="post_b_id", referencedColumnName="id")} * ) * @var ArrayCollection */ private $translations; ... }
Quedaría la siguientes tablas:
post
id | title |
---|---|
1 | prueba |
2 | test |
3 | hola |
post_translations
post_a_id | post_b_id |
---|---|
2 | 1 |
La consulta SQL sería así (funciona bien):
SELECT * FROM post p INNER JOIN post_translations t WHERE p.id <> t.post_b_id AND p.id <> t.post_a_id
El problema al construir la consulta con queryBuilder()
es que no diferencia el post_a_id
del post_b_id
porque todo lo recoge el atributo id
.
$this->createQueryBuilder('p') ->join('p.translations','t') ->where('p.id <> t.id and p.id <> p.id') //t.id = t.post_b_id y t.post_a_id ->getQuery() ->execute();
¿Alguna solución? muchas gracias
Respuestas
En esta respuesta de StackOverflow muestran un ejemplo parecido (ellos usan User
en vez de Post
, pero lo demás es igual) y lo solucionan haciendo leftJoin()
consigo mismo en el query builder.
@javiereguiluz
Muchas gracias Javier,
Ya está solucionado, para que funcione he tenido que convertir la relación Many-To-Many unidireccional en bidireccional y luego hacer uso de la nueva propiedad en la consulta.
$this->createQueryBuilder('p') ->leftJoin('p.translations', 't') ->leftJoin('p.translationsOf', 't2')
Muchas gracias Saludos
@JuanluGarciaB