GraphQL-有条件地执行子查询

GraphQL-有条件地执行子查询,graphql,react-apollo,Graphql,React Apollo,我正在尝试优化我的react组件执行的查询,这些组件在整个应用程序中共享,例如页脚和页眉组件 当变量institutionPath未提供时,我尝试不获取学生解决方案的详细信息 query organisationAndInstitution($organisationName: String!, $institutionPath: String!, $fetchInstitution: Boolean!){ organisation(where: { name: $organ

我正在尝试优化我的react组件执行的查询,这些组件在整个应用程序中共享,例如页脚和页眉组件

当变量
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)
指令


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

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

studentSolutionRelationships(where:{ 
  #...input fields omitted for brevity
}) @include(if: $fetchInstitution) {
  status
}
指令采用单个参数(
if
),该参数必须是
布尔值。该值可以是文字(即
true
false
)或
Boolean
类型的变量。GraphQL不提供计算表达式的方法——任何条件逻辑都必须驻留在客户机代码中,并用于确定传递给
if
参数的变量的值


这些指令可应用于文档中的任何字段,包括问题中的根级别指令,如
学生解决方案关系
组织
。事实上,您可以使用这些指令排除所有根字段——请记住,在这种情况下,查询仍将运行,只返回一个空对象


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

studentSolutionRelationships
organization
仍然是字段,它们恰好是查询根操作类型上的字段。你的方法没有错。当你说它“无效”时,你是什么意思?您看到了什么错误?FWIW,我看到缺少一个右括号,但这可能只是一个输入错误,而不是在您的代码中。当我尝试执行此操作时,查询挂起并最终超时。我使用的不是我自己的graphql服务器,而是第三方,所以可能这种东西没有在他们的后端实现。但我没有调试太多,因为我认为我做得不对,我会更深入地了解。谢谢(打字错误是因为我在这里去掉了很多噪音,专注于重要的事情)事实上你是对的。该查询在graphiql上运行良好,但在我的源代码中失败了,我猜不是没有正确翻译,就是我在代码中犯了错误。无论如何,这似乎是获取可选字段的正确方法!这在我的代码中确实是一个愚蠢的错误(没有为使用此查询的所有调用提供新变量)。如果你想写一个合适的回复,我会接受它并结束这个问题:)