2012-08-22 35 views
11

Tôi gặp vấn đề với việc duy trì nhiều mối quan hệ tự tham khảo. Tôi nhận được lỗi:Doctrine2 ManyToMany Tự tham khảo

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

Điều này xảy ra khi tôi xóa tất cả mục biểu mẫu của trẻ được lưu cùng với chúng. Rời khỏi ít nhất một không xảy ra lỗi. Ngoài ra nếu tôi ban đầu tiết kiệm thực thể không có con cái mọi thứ hoạt động tốt.

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

Nếu bạn đang thử nghiệm với các hình thức Symfony2 nhớ để thiết lập

"by_reference" => false

+0

Got cùng một vấn đề. Bất kỳ may mắn về điều này? –

+0

Xem bên dưới URL Tôi nghĩ rằng nó là rất giúp đỡ đầy đủ cho bạn. ** Cần trợ giúp để hiểu nhiều Học thuyết về nhiều mã tham chiếu tự mình ** http://stackoverflow.com/questions/3290319/need-help-understanding-doctrine-many-to-many-self-referencing-code –

+0

học thuyết của bạn ở đâu nhúng vào? symfony? phiên bản nào? –

Trả lời

2

tôi đã tìm thấy rằng vấn đề sẽ xảy ra khi các phương pháp UnitOfWork.scheduleCollectionDeletion được gọi là, ví dụ, từ MergeDoctrineCollectionListener .onBind() và đối tượng PersistentCollection đã được sao chép ('by_reference' = false)

Khắc phục nhanh cho vấn đề này là để bình luận dòng sau trong lớp MergeDoctrineCollectionListener:

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

Không nên bình luận mã nhà cung cấp vì nó sẽ ngăn bạn trong tương lai nhận bản cập nhật thông qua nhà soạn nhạc. Nếu bạn muốn làm điều này gọn gàng bạn có thể ngã ba repo của Doctrine, thực hiện thay đổi và ngã ba của bạn. Bằng cách đó bạn có thể duy trì một nhánh của Doctrine và vẫn có thể kéo ngược dòng từ Doctrine để cập nhật với codebase mới nhất. Nhận xét ra rằng dòng có thể có những thay đổi khác không đáng kể trong hành vi của Doctrine vì vậy tôi sẽ coi nó là thử nghiệm tốt nhất. – Bendihossan