形式 – Symfony – 表单类型集合 – 如何通过ID PUT实体

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

然后,我有两个实体,比如用户和设备.我为每一个构建了两种表单类型,虽然这两种表单之间的关系是OneToMany,但在第一个FormType中,’devices’字段是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"
      }
    }
  }
}

但它不起作用.

最佳答案 当您尝试按持久性更新实体时,您当前具有的实例未附加到实体管理器.然后,当您持久保存实体时,它会创建另一个实体.

如果附加,则需要将id添加到实体,并合并而不是persist.

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

替代方案:

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

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

点赞