Doctrine ManyToOne 关系:如何在不触及相关实体的情况下保存实体?
Doctrine ManyToOne relation: How to save an entity without touching a related entity?
我有一个使用 doctrine 的 Symfony 4.4 项目。
我想保存一个实体 AEntity ,它与其他几个实体相关。
其他实体之一 BEntity 已经存在并且不能被实体 AEntity 更改。所以AEntity只需要保存它与BEntity的关系,而BEntity不关心AEntity。
AEntity 与 BEntity 之间存在多对一关系。一个实体可以被多个实体使用。
/**
* @ORM\ManyToOne(targetEntity="BEntity", cascade={"persist"})
* @ORM\JoinColumn(name="b_entity_id", referencedColumnName="id")
* @SerializerGroups({"view", "collection"})
*/
private ?BEntity $bEntity = null;
在 BEntity 中,我必须将关系定义为 AEntity。
如何在不保存 BEntity 的情况下持久化 AEntity,包括将 b_entity_id 保存到数据库?
我的问题是,当我尝试保存 AEntity 时,BEntity 与 CEntity 之间存在多对一关系,这会导致麻烦。所以我宁愿不保存任何与 BEntity 相关的东西,因为它无论如何都没有被编辑。
这是(简化的)我现在的做法:
$aEntity = new AEntity();
$aEntity->setBEntity($bEntity);
$this->entityManager->persist($aEntity);
$this->entityManager->flush();
$this->entityManager->refresh($aEntity);
我需要更改什么?
如果我删除 cascade={"persist"},我会收到以下错误消息:
Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'App\Entity\AEntity#bEntity' that was not configured to cascade persist operations for entity: BEntity To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
我发现了问题:
设置 AEntity 值后,我将对象发送到帮助程序 class,在那里它发生了变化,尤其是连接的对象。这导致了我对 BEntity 的问题,因为现在学说认为有必要保存 BEntity 本身。
通过删除 Helper class 中任何多余的值设置,最终可以按预期进行保存。
因此,如果您只想保存外键而不想接触连接的实体,请执行以下操作:
- 在没有
, cascade={"persist"}
的情况下将AEntity中的BEntity设置为ManyToOne
- 通过数据库中的 id 获取 BEntity。
- 将此结果设置为您的 AEntity。
- 以后不要碰它!
- 保存实体
感谢@Vyktoria @yivi @Cerad 的输入!
我有一个使用 doctrine 的 Symfony 4.4 项目。 我想保存一个实体 AEntity ,它与其他几个实体相关。 其他实体之一 BEntity 已经存在并且不能被实体 AEntity 更改。所以AEntity只需要保存它与BEntity的关系,而BEntity不关心AEntity。
AEntity 与 BEntity 之间存在多对一关系。一个实体可以被多个实体使用。
/**
* @ORM\ManyToOne(targetEntity="BEntity", cascade={"persist"})
* @ORM\JoinColumn(name="b_entity_id", referencedColumnName="id")
* @SerializerGroups({"view", "collection"})
*/
private ?BEntity $bEntity = null;
在 BEntity 中,我必须将关系定义为 AEntity。
如何在不保存 BEntity 的情况下持久化 AEntity,包括将 b_entity_id 保存到数据库?
我的问题是,当我尝试保存 AEntity 时,BEntity 与 CEntity 之间存在多对一关系,这会导致麻烦。所以我宁愿不保存任何与 BEntity 相关的东西,因为它无论如何都没有被编辑。
这是(简化的)我现在的做法:
$aEntity = new AEntity();
$aEntity->setBEntity($bEntity);
$this->entityManager->persist($aEntity);
$this->entityManager->flush();
$this->entityManager->refresh($aEntity);
我需要更改什么?
如果我删除 cascade={"persist"},我会收到以下错误消息:
Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'App\Entity\AEntity#bEntity' that was not configured to cascade persist operations for entity: BEntity To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
我发现了问题:
设置 AEntity 值后,我将对象发送到帮助程序 class,在那里它发生了变化,尤其是连接的对象。这导致了我对 BEntity 的问题,因为现在学说认为有必要保存 BEntity 本身。
通过删除 Helper class 中任何多余的值设置,最终可以按预期进行保存。
因此,如果您只想保存外键而不想接触连接的实体,请执行以下操作:
- 在没有
, cascade={"persist"}
的情况下将AEntity中的BEntity设置为ManyToOne
- 通过数据库中的 id 获取 BEntity。
- 将此结果设置为您的 AEntity。
- 以后不要碰它!
- 保存实体
感谢@Vyktoria @yivi @Cerad 的输入!