Как сохранить сущности, когда у одного есть два родителя - PullRequest
1 голос
/ 10 мая 2019

Вот моя ситуация: Framework Symphony 4, использующий Doctrine (версия).У меня есть три объекта: A, B и C. Объект A имеет отношение OneToMany с B, и отношение OneToMany с C. Объект B имеет отношение OneToMany с C. В форме у меня есть collectionForm о субъекте C, встроенном вcollectionForm о сущности B. Добавление сущностей 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в этом случае?

До сих пор я безуспешно пытался удалить отношение OneToMany между B и C и добавить отношение ManyToOne в entityC для объекта B. Я чувствую, что могу обойти это отношение между Bи C это может сработать, но я не знаю как.

EntityA:


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;
    }

Entity 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;
    }

Entity 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), используя, если возможно, только одну форму.

...