doctrine-orm - 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"}).
解决方案
我发现了问题:
在设置了 AEntity 值后,我将对象发送到一个帮助类中,在那里它被更改了,尤其是连接的对象。这导致了我对 BEntity 的问题,因为现在教义认为有必要保存 BEntity 本身。
通过删除 Helper 类中任何多余的值设置,最终保存按预期工作。
因此,如果您只想保存外键而不接触连接的实体,请执行以下操作:
- 将 AEntity 中的 BEntity 设置为 ManyToOne
, cascade={"persist"}
- 通过 db 中的 id 获取 BEntity。
- 将此结果设置为您的 AEntity。
- 以后不要碰它!
- 保存实体
谢谢@Vyktoria @yivi @Cerad 的意见!
推荐阅读
- java - Java 如何在不同的类中使用对象?
- php - 为什么我的类在控制器中找到但在 Laravel 的模型中没有?
- c++ - 是否可以使用外部库构建 Qt 项目
- windows - Windows命令复制文件而不提示输入bat文件
- python - 用能量数据计算赫斯特指数 (aFRR) - Python
- reactjs - Agora.io - React:如何允许观众仅在主持人进入时加入流并在主持人离开时将其移除
- javascript - 如何在 JavaScript 中按值对地图进行排序
- database-migration - 确保 Flyway SQL 迁移一旦存储在 git 中就不会被修改,有什么建议吗?
- delphi - 如何在运行时创建的 Tgrid 中为列命名并在行中填充数据;(德尔福)
- javascript - 按钮/下拉菜单在新窗口中打开