en el caso de ManyToMany debes de especificar muy bien cual de las 2 entidades es la
propietaria o dueño de la relación, es decir, cual de las 2 es la encargada de gestionar las operaciones de inserción y modificación de la otra, por lo que lo ideal es que sea una relación bidireccional, de lo contrario Doctrine2 creará 2 tablas puente para manejar la relación de cada lado como si fuese el propietario.
Sé que no es un concepto fácil de digerir, pero puedes consultar mi copia de la traducción del Manual de
Doctrine2 por Nacho Pacheco, descargándola desde mi página:
http://maycolalvarez.com/downloads
Aquí te ofrezco un ejemplo de la relación Article M:M con Tag básico:
Dentro de la Entidad
Article:
Código PHP:
Ver original/**
* @var string $tags
*
* ORM\Column(name="tags", type="string", length=255)
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles")
* @ORM\JoinTable(name="article_tags",
* joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
* )
*/
private $tags;
el atributo $tags apunta a su lado inverso en la entidad Tag, que es el atributo $articles
inversedBy="articles", por lo tanto Article es el lado propietario y Tag el inverso
Dentro de la Entidad
Tag:
Código PHP:
Ver original/**
*
* @ORM\ManyToMany(targetEntity="Article", mappedBy="tags")
*/
private $articles;
Al contrario de lo anterior el atributo $articles apunta a su lado propietario, que es el atributo $tag de la Entidad Article, por lo tanto Tag es el lado inverso y Article el propietario.