簡體   English   中英

graphql:單個突變或每種類型一個突變

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM