[英]graphql: single mutation or one mutation per type
我有一个像这样的 GraphQL 架构:
type User {
id: ID
name: String
email: String
addresses: [UserAddress]
}
type UserAddress {
id: ID
city: String
country: String
}
我一直怀疑如何为突变做出最佳设计。 (我正在使用阿波罗+棱镜)
这些是我的选择:
1) 一个单一的突变
我需要创建这个突变和输入类型:
input userAddressInput {
id: ID
city: String
country: String
}
mutation updateUser (
id: ID
name: String
email: String
addresses: UserAddressInput
): User
然后我执行这样的突变:
mutation updateUserData($id: ID, $name: String, $email: String) {
updateUser(id: $id, name: $name, email: $email) {
id
name
email
}
}
mutation updateUserAddress($id: ID, $userAddress: UserAddressInput) {
updateUser(id: $id, userAddress: $userAddress) {
id
addresses {
id
city
country
}
}
}
像这样的解析器:
Mutation: {
updateUser: (_, args) => {
if (args.name || args.email) {
// update model User by args.userData.id
}
if (args.userAddress) {
// update model UserAddress by args.userAddress.id
}
}
}
2) 每种类型一个突变
我不需要创建任何输入类型,但我需要两个突变:
mutation updateUser (
id: ID
name: String
email: String
): User
mutation updateUserAddress (
id: ID
city: String
country: String
): UserAddress
然后像这样的突变:
mutation updateUser($id: ID, $name: String, $email: String) {
updateUser(id: $id, name: $name, email: $email) {
id
name
email
}
}
mutation updateUserAddress($id: ID, $city: String, $country: String) {
updateUserAddress(id: $id, city: $city, country: $country) {
id
city
country
}
}
像这样的解析器:
Mutation: {
updateUserAddress: (_, args) => {
// update model UserAddress by args.id
}
updateUser: (_, args) => {
// update model User by args.id
}
}
处理此类情况的最佳方法是什么?
这取决于您的用例是什么。
您的 GUI 是否允许在不更新用户信息的情况下更新用户地址? 如果是这样,您可能需要一个单独的突变来仅更新地址。
如果您允许编辑用户和地址并将其保存为一个操作,则单个突变将要求您发送多个 HTTP 请求(每个突变一个)。
您是否需要将用户和地址更新为原子事务(即全部或全部)? 如果是这样,那么您应该使用单个突变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.