Query builder con relación Many-To-many self-referencing

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

#1

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.

#2

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