GraphQL - 有条件地执行子查询

Posted

技术标签:

【中文标题】GraphQL - 有条件地执行子查询【英文标题】:GraphQL - Execute sub query conditionally 【发布时间】:2019-09-12 02:40:10 【问题描述】:

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

当未提供变量 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) 指令。

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

【问题讨论】:

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

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

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

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

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

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

【讨论】:

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

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

GraphQl 将查询参数传递给子类型

处理子查询中的 graphql 模式拼接错误

在 GraphQL 中将参数从根传递到子查询

Apollo GraphQL:子组件重新运行父查询?

雄辩地执行子查询?