当前位置: 首页 > 知识库问答 >
问题:

Symfony CollectionType更新实体

姬博瀚
2023-03-14

我不敢相信其他人没有想到这一点,但我无法找到解决办法。

假设我有两种实体类型,A和B具有一对多的关系。A有一个B的集合。

对于Bs,A的表单有一个集合类型(CollectionType),对于B有一个自定义的条目类型(entry\u type),允许添加(allow\u add)和删除(allow\u delete)设置为真(true)。创建/填充/呈现表单时,Bs字段由其在集合中的索引标识。当表单发回时,字段将根据索引再次映射回B实体。

如果数据库同时决定以不同的顺序返回Bs呢?然后在Bs上交换值!我不能那样做,因为其他实体会引用Bs,现在它们已经改变了它们的含义!

即使数据库不改变顺序,删除B时也会出现同样的问题:字段通过B转移,另一个被删除!(好吧,我不能100%确定会发生这种情况,因为发布的字段的编号存在差距。)我发现了这个类似的问题,当创建另一个时确实会发生这种情况(Symfony Collection Type将删除创建视为对项目的修改),但这种情况偏离了问题,没有可用的答案。

如何确保表单正在更新用户实际编辑的实体?

我已经尝试将Bs的ID渲染为HiddenType,但是表单正确地抱怨ID没有setter。无论如何,它可能会将ID强制到错误的B上,而Doctrine不喜欢这样。我想我可以将B添加为未映射并手动将值复制到正确的对象,但这会破坏Symfony的大部分表单系统。

我以前使用过CollectionType,但不适用于其他地方引用的实体。然后,我将删除所有以前的实体,并从发布的数据中重新创建集合。但我现在不能这么做,对吗?

共有1个答案

毛镜
2023-03-14

从原则2.1开始,可以更改关联的索引方式。这将允许您使用id作为集合键(因为该字段必须是唯一的):

@OneToMany(targetEntity="B", mappedBy="A", indexBy="id")

您可能还需要启用孤立删除,以便实际删除数据,而不是仅将关系设置为null。

 类似资料:
  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 在Symfony 2(最新版本)下,我试图更新我的实体: 我得到了这个错误消息到我的终端: [Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] 无法识别的选项“security.firewalls.access\u control”下的“0、1、2、3” 我是Symfony的新手,我不知道在哪里

  • 我正在尝试更新我的用户实体,我想到了一个错误:错误:NULL值违反了“id”列的Not NULL约束详细信息:失败的行包含(null,1,1) 这个问题肯定源于我在用户和配置文件之间的关系,即n-n

  • 在这种情况下,我希望检索数据,但在返回数据之前,我希望在不保存/持久化的情况下对其进行更改。 这是我的Rest控制器: 以下是服务实现: 最初我在服务上有注释。通过删除它而不在方法中使用它,我首先想到的是会话将使用存储库打开和关闭,如这里的答案所示。 这不起作用,我在评论中看到“会话将持续整个HTTP请求处理过程。”所以,在我添加的服务中 然后在我添加的方法中 在我做任何改变之前。然而,我所做的任

  • 我有一个User类,它有一些附加属性: 现在,如果我调用一些方法来改变其中一个房子(例如改变它的名称属性),如果我调用,我仍然会得到房子的旧值: 我如何确保它总是更新?