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 自引用的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 项目中的 Doctrine2 映射问题

Doctrine ManyToMany 自引用双向 - 父级未更新

Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

多对多关系上的 Doctrine2 findBy()

Doctrine2 - 无法删除具有单向 oneToMany 关系的实体