Doctrine2 ManyToMany 自引用
Posted
技术标签:
【中文标题】Doctrine2 ManyToMany 自引用【英文标题】:Doctrine2 ManyToMany Self referencing 【发布时间】:2012-08-22 16:02:52 【问题描述】:我在坚持多对多自引用关系时遇到了问题。 我收到错误:
在链配置的命名空间中找不到类“Doctrine\ORM\Persisters\ManyToManyPersister”
当我删除与它们一起保存的所有子表单项时,会发生这种情况。 至少留下一个不会导致错误发生。此外,如果我最初保存没有孩子的实体,一切正常。
/**
* 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;
如果您使用 Symfony2 表单进行测试,请记住设置
"by_reference" => 错误
【问题讨论】:
遇到了同样的问题。这有什么好运气吗? 见下面的 URL 我认为这对你很有帮助。 需要帮助理解 Doctrine 多对多自引用代码 ***.com/questions/3290319/… 你的教义嵌入在哪里?交响乐?哪个版本? 此问题已报告给 Doctrine doctrine-project.org/jira/browse/DDC-2074 【参考方案1】:我发现问题发生在调用方法 UnitOfWork.scheduleCollectionDeletion 时,例如,从 MergeDoctrineCollectionListener.onBind() 和 PersistentCollection 对象已被克隆('by_reference' = false)
此问题的快速解决方法是在 MergeDoctrineCollectionListener 类中注释以下行:
//$collection->clear();
【讨论】:
不应注释掉供应商代码,因为它会阻止您将来通过 composer 接收更新。如果你想巧妙地做到这一点,你可以 fork Doctrine 的 repo,进行更改和你的 fork。这样你就可以维护一个 Doctrine 的分支,并且仍然能够从 Doctrine 拉到上游以跟上最新的代码库。注释掉该行可能会对 Doctrine 的行为产生其他无法预料的变化,因此我充其量将其视为实验性的。以上是关于Doctrine2 ManyToMany 自引用的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine ManyToMany 自引用双向 - 父级未更新
Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库