如何在 GraphQL 查询变量中使用数组

Posted

技术标签:

【中文标题】如何在 GraphQL 查询变量中使用数组【英文标题】:How to use an array inside a GraphQL Query Variable 【发布时间】:2020-01-22 19:24:46 【问题描述】:

我想在 GraphQL 查询变量中使用一个数组,这样我就可以从 Gatsby 的单个查询中获取多个产品的数据,但是目前我遇到了错误。

我的 graphQL 查询如下所示:

query ($id: [String!]) 
  shopifyProduct(handle: eq: $id) 
    handle
    id
    title
    handle
    productType
    shopifyId
  

我的查询变量看起来像:


  "id": ["liner-jacket", "pocket-t-shirt"]

期望的响应是(类似于):


  "data": 
    "shopifyProduct": 
      "handle": "liner-jacket",
      "id": "Shopify__Product__hopbjidjoqjndadnawdawda123123=",
      "title": "Liner Jacket",
      "productType": "jacket",
      "shopifyId": "hopbjidjoqjndadnawdawda123123="
    ,
    "shopifyProduct": 
      "handle": "pocket-t-shirt",
      "id": "Shopify__Product__iajwdoiajdoadjwaowda4023123=",
      "title": "Pocket T-Shirt",
      "productType": "t-shirt",
      "shopifyId": "iajwdoiajdoadjwaowda4023123="
    
  

【问题讨论】:

【参考方案1】:

GraphQL 支持一种特殊的 List 类型,它表示特定类型的数组。例如,[String]String 类型的列表。尽管 [String] 类型 wraps String,但在 GraphQL 中,它被视为与 String独立不同类型。换句话说,你不能在需要String的地方使用[String],也不能在需要[String]的地方使用String

参数(如 handle)或输入对象字段(如 eq)只有一个 GraphQL 类型。如果将变量用作参数的值,则其类型必须与该参数的类型匹配。看来eq 的类型为String!(非空字符串),因此您只能传递一个String,而不是列表。

是否存在基于值数组进行查询的方法取决于服务器实现。一些模式支持这样做的方法(例如,可能有一个接受列表的in 字段而不是eq)。但是,这是特定于模式的。查看您正在使用的服务器/框架/库的文档,或使用可用的 GraphiQL 或 GraphQL Playground 界面探索架构。

【讨论】:

以上是关于如何在 GraphQL 查询变量中使用数组的主要内容,如果未能解决你的问题,请参考以下文章

在 graphQL 中提交对象数组作为查询变量

如何在 GraphQL (Relay) 中查询和改变数组类型?

如何在graphql查询中使用带有变量的%符号

Gatsby 和 GraphQL - 如何在查询中过滤数组

如何在 Connect 组件下的 graphql 查询中使用 $filter 变量?

apollo (graphQL) - 如何在查询中发送对象数组