【问题标题】:Doctrine throw error: "A new entity was found through the relationship" after removing entity教义抛出错误:删除实体后“通过关系找到新实体”
【发布时间】:2020-08-11 10:20:52
【问题描述】:

假设我有两个实体,ProjectUser 有关系。

项目.php

/**
 * @var User
 *
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(onDelete="SET NULL")
 */
private $creator;

当我删除 User 实体时,doctrineUser 对象(没有 ID)留在 Project 实体中。在正常情况下,这很好,但我使用的是DomainEvents。在这种情况下,删除用户实体后,DomainEvent 触发将一些数据保存在数据库中,并且二次保存数据(删除后)会抛出此错误。发生这种情况是因为现在在 Project 实体中,我们有分离的(来自 EMUser 没有 ID 的对象。

我想到了一个监听器,它会在删除后删除实体中的空对象,但我不确定这是一个好的变体

解决此错误的最佳变体是什么?

【问题讨论】:

    标签: symfony doctrine-orm symfony4


    【解决方案1】:

    onDelete 选项不应用级联删除。 如果你想这样做,我认为你应该将 cascade={"remove"} 选项添加到 ManyToOne。

    尝试如下:

    /**
     * @var User
     *
     * @ORM\ManyToOne(targetEntity="User", cascade={"remove"})
     * @ORM\JoinColumn(onDelete="SET NULL")
     */
    private $creator;
    

    Removing entity in doctrine

    【讨论】:

    • 项目不应该被删除,删除创建者时必须设置为null
    • @IhorKostrov 你现在有没有机会解决这个问题?我面临同样的问题。我基本上需要“孤立”子实体而不删除它,但是当我删除父实体时,Doctrine 通过子实体-> 父引用将其视为一个新实体。
    • @TonyBogdanov 我记得需要避免延迟加载您的实体,当您删除父实体时,不应将您的子实体加载到 UOW。
    • @IhorKostrov 是的,这很有道理,但可能并不总是可行。谢谢!
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多