如何一次更新 OneToMany 关系中的多个对象?
How to update multiple objects off a OneToMany relationship at a time?
我正在使用 ApiPlatform
假设我有一个实体 User
,在另一个名为 Experience
的实体上有一个 OneToMany
,因此我的用户可以有多种体验。
体验已经加载到数据库中,每个用户有100个,只能精确持续时间。
我想知道一次更新 10 个体验的最佳方式是什么。
我在邮递员上试过类似的东西:
{
"user": "/users/444217d0-84fa-4800-9c06-6f604f1be23f",
"experiences": [
{"@id": "/experiences/7c4f2f38-33cb-4e47-950e-0b5bea4014b4", "duration": 2},
{"@id": "/experiences/975c09b3-2430-4120-9c9e-f5e37032a5f9", "duration": 2},
{"@id": "/experiences/d2d8cbd8-e15e-4fc7-8238-55a915d69cd5", "duration": 3},
{"@id": "/experiences/ec54b2b1-a009-4d47-b14d-b1720d948dd4", "duration": 4},
{"@id": "/experiences/e734cd66-a328-43ae-9cd7-12bec7dd0615", "duration": 5},
{"@id": "/experiences/b640ed04-4e43-4844-abd4-2c0453731712", "duration": 4},
{"@id": "/experiences/1bc84609-c8a6-4b53-9245-bd1458cad716", "duration": 3},
{"@id": "/experiences/fa426aa3-7792-440c-a5cf-05e2263ce2bc", "duration": 2},
{"@id": "/experiences/072f4bb9-4b91-4063-a5c7-6d713322c8a4", "duration": 1},
{"@id": "/experiences/f2e66837-99bb-4c34-9544-ac56c721345b", "duration": 1}
]
}
它有效,但删除了与该用户关联的其他 90 个体验。
有谁知道更新此集合中的 10 个对象而不删除其他 90 个对象的方法吗?
不幸的是,发送嵌套文档在 Api 平台中不是很成熟的功能。只要您相应地配置了 $user 的属性,它 将 更新 Experience
对象,但同时 PUT / PATCH (?) 操作实际上正在替换(不是将 $user->experiences
的值与您提供的数组合并 - 这就是您失去其他关系的原因。
虽然您可以通过不同的方式实现您想要的。你可以
- 创建自定义操作(https://api-platform.com/docs/core/controllers/#creating-custom-operations-and-controllers)
- 使用 DTO 以及相应的输入变压器 (https://api-platform.com/docs/core/dto/#using-data-transfer-objects-dtos)
- (我会做什么:)注意更新(而不是替换)自定义(反)序列化器中的 $user->entities (https://api-platform.com/docs/core/serialization/#decorating-a-serializer-and-adding-extra-data)。
在任何情况下,您都必须手动注意将现有的 $user->experiences
与您的 PUT / PATCH 请求提供的合并。
编辑:哦,当然还有另一种方法,可能是api平台“推荐”的方法:只需为每个[发送PUT / PATCH请求=10=]资源。
我正在使用 ApiPlatform
假设我有一个实体 User
,在另一个名为 Experience
的实体上有一个 OneToMany
,因此我的用户可以有多种体验。
体验已经加载到数据库中,每个用户有100个,只能精确持续时间。
我想知道一次更新 10 个体验的最佳方式是什么。
我在邮递员上试过类似的东西:
{
"user": "/users/444217d0-84fa-4800-9c06-6f604f1be23f",
"experiences": [
{"@id": "/experiences/7c4f2f38-33cb-4e47-950e-0b5bea4014b4", "duration": 2},
{"@id": "/experiences/975c09b3-2430-4120-9c9e-f5e37032a5f9", "duration": 2},
{"@id": "/experiences/d2d8cbd8-e15e-4fc7-8238-55a915d69cd5", "duration": 3},
{"@id": "/experiences/ec54b2b1-a009-4d47-b14d-b1720d948dd4", "duration": 4},
{"@id": "/experiences/e734cd66-a328-43ae-9cd7-12bec7dd0615", "duration": 5},
{"@id": "/experiences/b640ed04-4e43-4844-abd4-2c0453731712", "duration": 4},
{"@id": "/experiences/1bc84609-c8a6-4b53-9245-bd1458cad716", "duration": 3},
{"@id": "/experiences/fa426aa3-7792-440c-a5cf-05e2263ce2bc", "duration": 2},
{"@id": "/experiences/072f4bb9-4b91-4063-a5c7-6d713322c8a4", "duration": 1},
{"@id": "/experiences/f2e66837-99bb-4c34-9544-ac56c721345b", "duration": 1}
]
}
它有效,但删除了与该用户关联的其他 90 个体验。
有谁知道更新此集合中的 10 个对象而不删除其他 90 个对象的方法吗?
不幸的是,发送嵌套文档在 Api 平台中不是很成熟的功能。只要您相应地配置了 $user 的属性,它 将 更新 Experience
对象,但同时 PUT / PATCH (?) 操作实际上正在替换(不是将 $user->experiences
的值与您提供的数组合并 - 这就是您失去其他关系的原因。
虽然您可以通过不同的方式实现您想要的。你可以
- 创建自定义操作(https://api-platform.com/docs/core/controllers/#creating-custom-operations-and-controllers)
- 使用 DTO 以及相应的输入变压器 (https://api-platform.com/docs/core/dto/#using-data-transfer-objects-dtos)
- (我会做什么:)注意更新(而不是替换)自定义(反)序列化器中的 $user->entities (https://api-platform.com/docs/core/serialization/#decorating-a-serializer-and-adding-extra-data)。
在任何情况下,您都必须手动注意将现有的 $user->experiences
与您的 PUT / PATCH 请求提供的合并。
编辑:哦,当然还有另一种方法,可能是api平台“推荐”的方法:只需为每个[发送PUT / PATCH请求=10=]资源。