如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?

Posted

技术标签:

【中文标题】如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?【英文标题】:How do you pass a list or array of objects into a GraphQL mutation designed to update a single object? 【发布时间】:2017-09-03 08:49:17 【问题描述】:

我正在使用Scaphold.io 构建我正在开发的一个小应用程序的后端,但在尝试更新单个突变请求中的多个项目时遇到了问题。

在 Scaphold 中,当您创建新类型时,会为常见操作创建突变:创建、更新和删除。

您无法为这些突变或它们的输入类型重新定义架构。在我正在使用的模型类型 (card) 中,我得到了开箱即用的这些突变:

createCard(input: CreateCardInput!): CreateCardPayload

updateCard(input: UpdateCardInput!): UpdateCardPayload

deleteCard(input: DeleteCardInput!): DeleteCardPayload

updateCardInput 类型定义了以下字段:

listId: ID
description: Text
name: String
order: Int
id: ID!
clientMutationId: String

我能做什么:更新一张卡片

有了这个,我知道如何定义一个更新 order 单个卡的突变:

mutation updateCardOrder($card: UpdateCardInput!) 
  updateCard(input: $card) 
    changedCard 
      id
      order
    
  

变量:


  "card": 
    "id": "Q2FyZDo4MzA=",
    "order": "1"
  


我想做的事:在一个突变中更新多张卡片

我得到了一些使用卡片列表 ([card]) 作为输入的提示,但我不知道如何让它工作。

理想情况下,类似于:

mutation updateCardOrder($cards: UpdateCardInput!) 
  updateCard(input: $card) 
    changedCard 
      id
      order
    
  

并将多张卡片作为变量传入,例如:


  "cards": [
    
      "id": "Q2FyZDo4Mjk=",
      "order": "1"
    ,
    
      "id": "Q2FyZDo4MzA=",
      "order": "2"
    
  ]

当我尝试这个时,我得到一个错误:


  "errors": [
    
      "message": "Variable \"$cards\" of type \"[UpdateCardInput!]\" used in position expecting type \"UpdateCardInput!\".",
      "locations": [
        
          "line": 1,
          "column": 32
        ,
        
          "line": 2,
          "column": 27
        
      ],
      "name": "GraphQLError"
    
  ]


那么……鉴于我无法在 Scaphold 中更改输入类型或突变模式,在 GraphQL 中考虑这样做的正确方法是什么?有没有可能?

【问题讨论】:

你找到答案了吗? 【参考方案1】:

由于您想在单个请求中运行多个变更,您可以使用 GraphQL 别名来完成此操作。更多信息在这里:https://github.com/mugli/learning-graphql/blob/master/3.%20Querying%20with%20Field%20Aliases%20and%20Fragments.md

基本上,你可以做的是像这样运行一个突变:

mutation updateCardOrder($card1: UpdateCardInput!, $card2: UpdateCardInput!, $card3: UpdateCardInput!) 
  update1: updateCard(input: $card1) 
    changedCard 
      id
      order
    
  
  update2: updateCard(input: $card2) 
    changedCard 
      id
      order
    
  
  update3: updateCard(input: $card3) 
    changedCard 
      id
      order
    
  

变量看起来像这样:


  "card1": 
    "id": "Q2FyZDo4Mjk=",
    "order": "1"
  ,
  "card2": 
    "id": "Q2FyZDo4MzA=",
    "order": "2"
  ,
  "card3": 
    "id": "Q2FyZDo4MzA=",
    "order": "3"
  

希望有帮助!

【讨论】:

这听起来适得其反,如果您需要 10 张卡片,则需要 10 个参数。我们需要动态的东西! 赞成。您可以使用此问题***.com/questions/41688883/… 中的脚本来执行此操作

以上是关于如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?的主要内容,如果未能解决你的问题,请参考以下文章

将对象的嵌套数组列表从适配器传递到活动

如何将单个对象 [] 传递给参数对象 []

如何通过具有不可序列化数据的意图传递数组或数组列表?

是否应该始终将函数用于传递数组或对象的 setState?

如何将对象(或关联数组)作为属性值传递给我的 Web 组件

如何将获取的 iCloud 数据对象保存到单个数组中?