Symfony - 表单类型集合 - 如何通过ID PUT实体

4

我正在开发一个Symfony项目(API),它使用JSMSerializer,因此发送的每个数据负载都是json格式。

接下来,我有两个实体,比如User和Devices。我为每个实体构建了两种表单类型,在这两者之间的关系是OneToMany时,在第一个实体的FormType中,“devices”字段是DeviceType表单的集合。

当添加时,很简单,您只需发布类似于此的内容:

{
  "user": {
    "name": "John",
    "devices": [
      {
        "os": "Android",
        "color": "red"
      },
      {
        "os": "Android",
        "color": "blue"
      }
    ]
  }
}

一切都运行良好。实体已在数据库中持久化。

在更新时,可以发送相同的负载,在完全相同的顺序下,使用一些修改后的数据,就像这样:

{
  "user": {
    "name": "John",
    "devices": [
      {
        "os": "Android",
        "color": "redish"
      },
      {
        "os": "Android",
        "color": "blueish"
      }
    ]
  }
}

然后Symfony就能发挥其魔力。

我的问题是在更新时发送设备的顺序改变。这会引起各种问题。

我的问题是如何发送集合中元素的ID,以便Symfony/Doctrine可以映射并知道如何更新?

我想到了这样的方法

{
  "user": {
    "name": "John",
    "devices": {
      "2": {
        "os": "Android",
        "color": "blueish"
      },
      "1": {
        "os": "Android",
        "color": "redish"
      }
    }
  }
}

但它无法正常运行。

1个回答

2
当您尝试通过persist更新实体时,您当前拥有的实例未附加到实体管理器。然后,当您persist实体时,它会创建另一个实体。
如果发生这种情况,您需要将id添加到实体中,并使用merge而不是persist。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#merging-entities

替代方案:
如果您正在请求更新列表中的设备顺序,也许您只需要发送一个包含新顺序的数组,例如array(id => newOrder, ...),然后加载所有属于用户的设备,更新它们的顺序并刷新它们。
在此解决方案中,顺序必须是实体属性,整数类型。如果尚未完成,则应该完成。

当使用表单类型时,当实例化表单类型时,实体的一个实例会通过构造函数传递。传递给表单类型的实体(在本例中为用户)是通过某个存储库找到的,因此它及其相关实体(在本例中为设备)被“知道”EntityManager。如果您对这些实体进行了一些更新并执行了EntityManager :: flush(),则会在数据库中看到这些更新。 - Michael
另一方面,我认为我已经找到了一个解决方法。如果没有明确的答案出现,我可能会发布我的解决方案。感谢您的建议! - Michael
@Michael,我知道已经过了一段时间,但你能向我展示一下你是如何让这个工作的吗?我正在尝试实现类似的东西。 - Joren vh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接