GraphQL - 有条件地执行子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GraphQL - 有条件地执行子查询相关的知识,希望对你有一定的参考价值。

我正在尝试优化由整个应用程序共享的一些反应组件执行的查询,例如Footer和Header组件。

我没有提供变量institutionPath时,我试图不获取学生解决方案的详细信息。

query organisationAndInstitution($organisationName: String!, $institutionPath: String!, $fetchInstitution: Boolean!){
    organisation(where: {
      name: $organisationName
    }){
      name
    }

    studentSolutionRelationships(where:{ 
      AND: [
        {
          status: PUBLISHED
        },
        {
          studentSolution: {
            status: PUBLISHED
          }
        }
      ]
    }) @include(if: $fetchInstitution) {
      status
  }
}

为此,我添加了一个fetchInstitution布尔变量并添加了@include(if: $fetchInstitution)指令。

但是指令似乎只适用于字段,而不适用于整个查询。所以我想知道我想做什么是可能的,因为我写它的方式是无效的。

答案

可以使用@include指令显式包含GraphQL文档中的任何字段,也可以使用@skip指令明确排除。该指令应在字段名称和参数之后提供,但在字段的选择集之前,如果它有一个,如您的问题所示:

studentSolutionRelationships(where:{ 
  #...input fields omitted for brevity
}) @include(if: $fetchInstitution) {
  status
}

该指令采用单个参数(if),该参数必须是Boolean值。该值可以是文字(即truefalse)或Boolean类型的变量。 GraphQL不提供计算表达式的方法 - 任何条件逻辑都必须驻留在客户端代码中,并用于确定传递给if参数的变量的值。

指令可以应用于文档中的任何字段,包括问题中的studentSolutionRelationshipsorganisation等根级别的字段。实际上,您可以使用这些指令排除所有根字段 - 请记住,在这种情况下,查询仍将运行并返回一个空对象。

换句话说,你的方法是正确的。如果查询失败,那是因为一个不相关的问题。

以上是关于GraphQL - 有条件地执行子查询的主要内容,如果未能解决你的问题,请参考以下文章

获取查询后有条件地执行 graphql 突变

GraphQL 查询,根据某些条件使用片段。已加载 GraphQL 文件

Laravel 5.8 有条件地插入 sql 片段

GraphQL - 有条件地获取字段

将 graphQL 片段添加到模式中,并且可用于所有查询

你如何在 python 中处理 graphql 查询和片段?