首页 > 解决方案 > 当一个人有两个父母时如何持久化实体

问题描述

这是我的情况:

框架 Symfony 4,使用 Doctrine(version)。

我有三个实体:A、B 和 C。实体 A 与 B 具有 OneToMany 关系,与 C 具有 OneToMany 关系。实体 B 与 C 具有 OneToMany 关系。

在一个表单中,我有一个关于实体 C 的 collectionForm 嵌入在关于实体 B 的 collectionForm 中。在表单中添加实体 B 和 C 是可选的。

但是,当尝试添加实体 C(因此实体 B)时,看到实体 C 有两个父级(A 和 B),学说无法知道以哪个顺序保留它们,并给出以下错误:

通过关系“App\Entity\EntityC#entityB”找到了一个新实体,该实体未配置为对实体进行级联持久化操作:App\Entity\EntityB@0000000010cd7f460000000077359844。要解决这个问题:要么在这个未知实体上显式调用 EntityManager#persist(),要么配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“App\Entity\EntityB#__toString()”以获得线索。

在这种情况下,我如何告诉教义首先保留实体 A,然后是 B,然后是 C?

到目前为止,我已经尝试删除 B 和 C 之间的 OneToMany 关系,但没有任何运气,并在 entityC 中为实体 B 添加 ManyToOne 关系。我觉得如果我可以绕过 B 和 C 之间的这种关系,这可以工作,但我没有不知道怎么做。

实体A:


class entityA extends BaseEntityA {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityB", mappedBy="entityA", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityA_id", nullable=false)
     */
    protected $entitiesB;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityC", mappedBy="entityA", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityA_id", nullable=false)
     */
    protected $entitesC;

...

    /**
     * Add EntityB entity to collection (one to many).
     *
     * @param \App\Entity\EntityB $entityB
     *
     * @return \App\Entity\EntityA
     */
    public function addEntityB(\App\Entity\EntityB $entityB)
    {
        $this->entitiesB[] = $entityB;
        $entityB->setEntityA($this);
        return $this;
    }

    /**
     * Add EntityC entity to collection (one to many).
     *
     * @param \App\Entity\EntityC $entityC
     *
     * @return \App\Entity\EntityA
     */
    public function addEntityC(\App\Entity\EntityC $entityC)
    {
        $this->entitiesC[] = $entityC;
        $vehicle->setEntityA($this);
        return $this;
    }

实体 B:


class EntityB extends BaseEntityB {
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\EntityC", mappedBy="entityB", cascade={"persist"})
     * @ORM\JoinColumn(name="id", referencedColumnName="entityB_id", nullable=false)
     */
    protected $entitiesC;

...

    /**
     * @param Collection $entitiesC
     *
     * @return $this
     */
    public function setEntityC(Collection $entitiesC)
    {
        $this->entitiesC = $entitiesC;

        return $this;
    }

    /**
     * Add EntityC entity to collection (one to many).
     *
     * @param \App\Entity\EntityC $entityC
     *
     * @return \App\Entity\EntityB
     */
    public function addEntityC(\App\Entity\EntityC $entityC)
    {
        $this->entitiesC[] = $entityC;
        $entityC->setEntityB($this);
        $entityC->setEntityA($this->getEntityA());

        // Things I tried to remove the relationship between B and C
//        $this->getEntityA()->addEntityC($entityC);
//        $entityC->setEntityB($this);
        return $this;
    }

实体 C:


class EntityC extends BaseEntityC {

// Somtehing I tried at some point
//    /**
//     * @ORM\ManyToOne(targetEntity="EntityB", inversedBy="entitiesC", cascade={"persist"})
//     * @ORM\JoinColumn(name="entityB_id", referencedColumnName="id")
//     */
//    protected $entityB;

...
}

我想以正确的顺序(A 然后 B 然后 C)保留这些实体,如果可能的话只使用一种形式。

标签: symfonydoctrine

解决方案


推荐阅读