gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:49:22 24 4
gpt4 key购买 nike

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

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

添加时,很简单,您必须发布这样的内容

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

一切都很好。实体保存在 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 添加到实体,和 合并 而不是 坚持 .

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

替代解决方案:

如果您正在请求更新列表中的设备顺序,也许您应该只发送一个具有新顺序的数组,例如 array(id => newOrder, ...),然后加载用户拥有的所有设备,更新他们的设备命令,然后冲洗它们。

在这个解决方案中,订单必须是一个实体属性,整数。如果还没有完成,应该是

关于forms - Symfony - 表单类型集合 - 如何通过 ID PUT 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24208341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com