首页 > 解决方案 > Doctrine ManyToOne 关系:如何在不触及相关实体的情况下保存实体?

问题描述

我有一个使用教义的 Symfony 4.4 项目。我想保存一个实体 AEntity ,它与其他几个实体有关。其他实体之一 BEntity 已经存在并且不能由实体 AEntity 更改。所以 AEntity 只需要保存它与 BEntity 的关系,而 BEntity 并不关心 AEntity。

AEntity 与 BEntity 具有多对一关系。一个 BEntity 可以被多个 AEntity 使用。

/**
 * @ORM\ManyToOne(targetEntity="BEntity", cascade={"persist"})
 * @ORM\JoinColumn(name="b_entity_id", referencedColumnName="id")
 * @SerializerGroups({"view", "collection"})
 */
private ?BEntity $bEntity = null;

在 BEntity 中,我必须将关系定义为 AEntity。

如何持久化 AEntity,包括将 b_entity_id 保存到数据库,而不保存 BEntity?

我的问题是,当我尝试保存 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"}).

标签: doctrine-orm

解决方案


我发现了问题:

在设置了 AEntity 值后,我将对象发送到一个帮助类中,在那里它被更改了,尤其是连接的对象。这导致了我对 BEntity 的问题,因为现在教义认为有必要保存 BEntity 本身。

通过删除 Helper 类中任何多余的值设置,最终保存按预期工作。

因此,如果您只想保存外键而不接触连接的实体,请执行以下操作:

  • 将 AEntity 中的 BEntity 设置为 ManyToOne, cascade={"persist"}
  • 通过 db 中的 id 获取 BEntity。
  • 将此结果设置为您的 AEntity。
  • 以后不要碰它!
  • 保存实体

谢谢@Vyktoria @yivi @Cerad 的意见!


推荐阅读