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 的输入!