[英]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.