GraphQL 中的动态查询

2025-06-08

GraphQL 中的动态查询

一个简单的 GraphQL 查询如下所示:

query myQuery() {
    user {
        age
        firstName
        lastName
        dob
       }
     } 

上述查询返回格式如下

data {
   user {
       age: 23,
       firstName: "John",
       lastName: "Smith",
       dob: "01-01-1970"
   }
 }

嗯,这很标准。GraphQL 端点会返回请求的确切字段。

现在,如果我想每次都查询不同的字段怎么办?例如,我想先查询{ age, firstName }第一次,然后再查询第二次{ age, dob }。我不想firstName在第二次查询时获取数据,因为我不需要它。这是一种可靠的方法,尤其是在 API 调用涉及某些字段时。

用例如下

  1. UI 上有一个清单,其中包含需要获取的数据元素。
  2. 用户选择他的授权标准,我们只想获取该标准。

一种方法是根据指定的字段生成查询。但是,一旦引入嵌套的 JSON,就会变得非常混乱。

为了解决这个问题,GraphQL 有一个非常方便的功能,称为指令。具体来说,@include指令解决了动态查询的问题。

@include现在,我们将使用指令重写上述查询。

query myQuery($age: Boolean!, $firstName: Boolean!, $lastName: Boolean!, $dob: Boolean!) {
       user {
       age @include(if: $age)
       firstName @include(if: $firstName)
       lastName @include(if: $lastName)
       dob @include(if: $dob)
       }
}

variables: 
 {
  age: true,
  firstName: true,
  lastName: false,
  dob: false
  }

上述查询的响应将是:

data {
   user {
       age: 23,
       firstName: "John"
   }
 }

age由于仅返回在 JSON 变量中firstName被设置为 的那些值,因此它仅返回 和 。此指令的另一个优点是,GraphQL 引擎甚至不会执行相应的解析器,从而提升了性能。操作这些 JSON 变量非常简单,查询无需针对每个请求进行修改。要获取而不是 的,我们只需更改JSON 变量中的和 即可。true@includedobfirstNamefirstName: falsedob: true

使用此指令的缺点是查询会变得更加冗长,并且需要在多个位置重复变量。但正如这里所解释的,它是 GraphQL 类型安全的固有组成部分。

鏂囩珷鏉ユ簮锛�https://dev.to/freakomonk/dynamic-queries-in-graphql-1pbb
PREV
2019 年成为一名全栈工程师
NEXT
🧰 DevilBox:容器化的 PHP 开发环境(第一部分)