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

时间:2014-06-13 14:56:58

标签: forms symfony one-to-many jmsserializerbundle

我在Symfony项目(API)上工作,它使用JSMSerializer,因此作为有效负载发送的每个数据都是json格式。

然后,我有两个实体,比如用户和设备。我为每一个构建了两种表单类型,虽然这两种表单之间的关系是OneToMany,但在第一种FormType中,' devices' field是DeviceType表单的集合。

添加时,很简单,你必须发布这样的东西

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

Everithing工作得很好。实体持久存储在db。

更新时,可以使用一些修改过的数据以相同的顺序发送相同的有效负载,就像这样

{
  "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 个答案:

答案 0 :(得分:2)

当您尝试通过persist更新实体时,您当前的实例未附加到实体管理器。然后,当您持久保存实体时,它会创建另一个实体。

如果附加,则需要将ID添加到实体,合并而不是保留

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

替代解决方案:

如果您要求更新列表中的设备订单,也许您应该发送一个包含新订单的数组,例如array(id => newOrder,...),并加载所有设备用户,更新他们的订单,并冲洗它们。

在此解决方案中,订单必须是实体属性,整数。如果尚未完成,则应为