symfony - 当一个人有两个父母时如何持久化实体
问题描述
这是我的情况:
框架 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)保留这些实体,如果可能的话只使用一种形式。
解决方案
推荐阅读
- python - Python pandas:从 DataFrame 中删除表情符号
- database - Laravel 在同一张桌子上按孩子排序
- flutter - 编码风格问题:使用事件存储数据而不产生状态
- xml - 如何在 Oracle 的 XML 列中使用 LIKE 子句?
- php - 计算 < X 的幂的 PHP 脚本
- python-3.x - 在函数中调用函数导致执行问题
- vue.js - 将单选按钮值更改为“选中”(Vue.js、Vuetify)
- json - 我需要从两个变量之间的单行 json-data 中提取数据(Powershell)
- node.js - 使用屏幕截图诊断在 Heroku 上运行的 Puppeteer 上的错误
- javascript - Outlook 插件:如何使用 Outlook 桌面显示 console.log?