2012-08-22 29 views
11

Ho avuto problemi con il persistere di molti a molte relazioni autoreferenziali. Ricevo errore:Doctrine2 ManyToMany Self referencing

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

Questo succede quando rimuovo tutto l'oggetto modulo bambini salvati con loro. Lasciando almeno uno non si verificano errori. Inoltre, se inizialmente salvi l'entità senza figli, tutto funziona correttamente.

/** 
    * 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; 
} 

Se stai test con forme Symfony2 Ricordate di impostare

"by_reference" => false

+0

avuto lo stesso problema. Qualche fortuna su questo? –

+0

Vedi sotto URL Penso che sia di grande aiuto per te. ** Hai bisogno di aiuto per capire Doctrine molti a molti codici autoreferenziali ** http://stackoverflow.com/questions/3290319/need-help-understanding-doctrine-many-to-many-self-referencing-code –

+0

dove è la tua dottrina incorporato? symfony? quale versione? –

risposta

2

ho trovato che il problema si verifica quando il metodo UnitOfWork.scheduleCollectionDeletion è chiamato, per esempio, da MergeDoctrineCollectionListener .onBind() e PersistentCollection l'oggetto è stato clonato ('by_reference' = false)

Una soluzione rapida a questo problema è quella di commentare la seguente riga nella classe diMergeDoctrineCollectionListener:

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

Non si deve commentare il codice fornitore in quanto ciò vi impedirà in futuro da ricevere aggiornamenti tramite il compositore. Se volessi farlo in maniera ordinata, potresti ricorrere al repository di Doctrine, apportare le modifiche e la forchetta. In questo modo puoi mantenere un fork di Doctrine ed essere ancora in grado di eseguire il upstream da Doctrine per tenersi aggiornato con l'ultima base di codice. Commentando quella linea potrebbero esserci altri cambiamenti imprevisti nel comportamento di Doctrine, quindi lo tratterei come sperimentale al meglio. – Bendihossan