为啥这个 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。这两个孩子是CommentMessage

在某些情况下,我们希望从 message 复制 comment

我们想指出发生这种情况的位置,因此我们添加了一个名为 copied_to_id 的列。每次我们将message 复制到comment 时,我们都会将messagescopied_to_id 设置为新创建的commentid

现在我们像这样为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 idreferencedColumnName 但似乎没有任何效果。

docs 中的示例的设置似乎与我描述的类似。

在这个article 中,我注意到它提到一对一不能延迟加载逆。也许这就是我们遇到的问题,但是有什么办法可以解决这个问题呢?

教义:2.13.1 Laravel-Doctrine:1.7.9

【问题讨论】:

【参考方案1】:

显然这是一个已知问题。

post 中的选项 4 和 6 是似乎可行的解决方法。

【讨论】:

以上是关于为啥这个 Doctrine OneToOne 自引用双向关联不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”

Doctrine 2 OneToOne 实体映射返回空实体

Doctrine 和 SymfonySeoBundle 复制 OneToOne 关系

Doctrine2.3 和 OneToOne 级联持续似乎不起作用

EntityAudit - Doctrine2:可能在 OneToMany 和 OneToOne 中使用相同的实体

Doctrine 2 OneToOne Identity through foreign Entities Error while persisting