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