2012-08-22 22 views
11

Tengo problemas con la persistencia de muchas o muchas relaciones de autorreferencia. recibo de error:Doctrine2 ManyToMany Referencia automática

The class 'Doctrine\ORM\Persisters\ManyToManyPersister' was not found in the chain configured namespaces

Esto ocurre cuando elimino todo elemento de formulario niños salvados con ellos. dejando al menos uno no haga que ocurra un error. Además, si inicialmente guardo la entidad sin hijos todo funciona bien.

/** 
    * West\AlbumBundle\Entity\Album 
    * 
    * @ORM\Table(name="albums") 
    * @ORM\Entity(repositoryClass="West\AlbumBundle\Entity\AlbumRepository") 
    * @ORM\HasLifecycleCallbacks 
    */ 
class Album extends Entity implements CrudEntity 
{ 

    /** 
     * @ORM\ManyToMany(targetEntity="Album") 
     * @ORM\JoinTable(name="albums_relations", 
     *   joinColumns={@ORM\JoinColumn(name="album_id", referencedColumnName="id")}, 
     *   inverseJoinColumns={@ORM\JoinColumn(name="related_album_id", referencedColumnName="id")} 
     *) 
     * @var ArrayCollection 
     */ 
     protected $related_albums; 
} 

Si está probando con las formas de Symfony2, no olvide colocar

"by_reference" => false

+0

dieron el mismo problema. ¿Alguna suerte en esto? –

+0

Vea a continuación la URL Creo que es de mucha ayuda para usted. ** Necesita ayuda para entender Doctrine código de auto referencia muchos a muchos ** http://stackoverflow.com/questions/3290319/need-help-understanding-doctrine-many-to-many-self-referencing-code –

+0

¿dónde está su doctrina? ¿incrustado en? Symfony? ¿cual version? –

Respuesta

2

me he dado cuenta que el problema ocurre cuando el método UnitOfWork.scheduleCollectionDeletion se llama, por ejemplo, de MergeDoctrineCollectionListener .onBind() y el objeto PersistentCollection ha sido clonado ('by_reference' = falso)

Una solución rápida a este problema es comentar la siguiente línea en el clase MergeDoctrineCollectionListener:

//$collection->clear(); 
+1

No debería estar comentando el código del proveedor, ya que le impedirá en el futuro de recibir actualizaciones a través del compositor. Si quisieras hacer esto cuidadosamente, podrías copiar el repositorio de Doctrine, hacer el cambio y tu tenedor. De esta forma, podría mantener una bifurcación de Doctrine y aún así poder avanzar desde Doctrine para mantenerse actualizado con la última base de código. Comentando esa línea podría haber otros cambios imprevistos en el comportamiento de Doctrine, así que lo trataría como experimental en el mejor de los casos. – Bendihossan