为啥这个 Doctrine OneToOne 自引用双向关联不起作用?
Posted
技术标签:
【中文标题】为啥这个 Doctrine OneToOne 自引用双向关联不起作用?【英文标题】:Why is this Doctrine OneToOne Self-referencing Bidirectional association not working?为什么这个 Doctrine OneToOne 自引用双向关联不起作用? 【发布时间】:2021-09-01 18:36:38 【问题描述】:我们有两个实体使用InheritanceType("SINGLE_TABLE")
。
定义DiscriminatorMap
的父类是Note
。这两个孩子是Comment
和Message
。
在某些情况下,我们希望从 message
复制 comment
。
我们想指出发生这种情况的位置,因此我们添加了一个名为 copied_to_id
的列。每次我们将message
复制到comment
时,我们都会将messages
的copied_to_id
设置为新创建的comment
的id
。
现在我们像这样为Message
实体添加了一个关联...
/**
* @var Comment
*
* @ORM\OneToOne(targetEntity=Comment::class, inversedBy="copiedFrom")
* @ORM\JoinColumn(name="id", referencedColumnName="copied_to_id", nullable=true)
*/
protected $copiedTo;
一切运行良好,我们能够通过请求$message->copiedTo
获得新创建的comment
。但是,一旦我们在此处以及在 Comment 类中添加了 inversedBy
部分,这一切都发生了变化。我们希望能够通过使用 $comment->copiedFrom
来反转关系。
/**
* @var Message
*
* @ORM\OneToOne(targetEntity=Message::class, mappedBy="copiedTo")
*/
protected $copiedFrom;
一旦我们这样做了,它就会停止工作,不仅是从 null 复制的,而且当我们查询 Comments 时,它只返回一条评论(而不是应该返回的 7 条)。
我们是否正确地认为这是建立这种类型的 OneToOne 关系的方式?如果是,我们可能做错了什么?
(我们用雄辩的方式建立了这种关系,轻而易举,所以我们认为它是正确的)
我们尝试在关联中移动并使用 mappedBy 和 inversedBy 以及更改 JoinColumn
id
和 referencedColumnName
但似乎没有任何效果。
docs 中的示例的设置似乎与我描述的类似。
在这个article 中,我注意到它提到一对一不能延迟加载逆。也许这就是我们遇到的问题,但是有什么办法可以解决这个问题呢?
教义:2.13.1
Laravel-Doctrine:1.7.9
【问题讨论】:
【参考方案1】:显然这是一个已知问题。
post 中的选项 4 和 6 是似乎可行的解决方法。
【讨论】:
以上是关于为啥这个 Doctrine OneToOne 自引用双向关联不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”
Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系
Doctrine2.3 和 OneToOne 级联持续似乎不起作用
EntityAudit - Doctrine2:可能在 OneToMany 和 OneToOne 中使用相同的实体
Doctrine 2 OneToOne Identity through foreign Entities Error while persisting