中继:根据父查询的结果参数化 getFragment

Posted

技术标签:

【中文标题】中继:根据父查询的结果参数化 getFragment【英文标题】:Relay: Parametrize getFragment based on results of a parent query 【发布时间】:2016-08-09 03:14:37 【问题描述】:

我的 CMS 向我返回一个节点列表,每个节点都有自己的节点类型。对于每个节点类型,我定义了一个对应的 GraphQL 类型。

type getContent 
  content: [ContentNode]

我想要这样的查询:


  content
    contentType
    properties 
       $ContentType.getFragment('content', type: $contentType???)
    
  

ContentType 将根据提供给它的类型变量返回正确的片段定义。但是如何从父结果中获取$contentType

【问题讨论】:

【参考方案1】:

您不能拥有依赖于父级实际值的片段,因为片段是在实际向服务器发出查询请求之前组成的。有两种不同的方法来处理这个问题,一种是让片段根据变量而变化,另一种是在组件中使用接口和类型化片段。

这是一个很好的答案,展示了使用变量的示例:Conditional fragments or embedded root-containers when using Relay with React-Native

对于接口解决方案,如果您有 ContentNode 的接口,其实现类似于“ContentNode1”和“ContentNode2”,那么您可以这样做:


  content 
    $ContentType.getFragment('content')
  

在你的 ContentType 组件中

fragment on ContentNode 
   contentType
   someOtherCommonField
   ... on ContentNode1 
     someContent1Field
   

   ... on ContentNode2 
     someContent2Field
   

【讨论】:

非常感谢您的精彩回复。我将尝试探索您的接口解决方案,到目前为止看起来很有希望,并且一旦我最终得到它,就会将您的答案标记为已接受。 条件片段对我不起作用,因为路由信息不包含我正在渲染的元素类型(因为这可能是元素的固定集合)。但是您的第二种方法似乎真的很酷。但是有一个问题:当像... on ContentNode1 那样做某事时,这个片段是否只包含在这种类型中?所以不会有任何重复的信息返回? s/固定收藏/混合收藏/ @Dmitry:信息重复是什么意思?一种类型只能是某个接口的一种实现,如果这是您所要求的。 是的,这就是我的意思。我需要尝试更多地尝试,但我认为这正是我所需要的,因此接受答案。谢谢!

以上是关于中继:根据父查询的结果参数化 getFragment的主要内容,如果未能解决你的问题,请参考以下文章

在sql server中参数化全文查询

如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢

中继fetchQuery:如何在没有片段结构的情况下获取查询结果

用jmeter可以对数据库进行关联吗

UNION ALL 参数化查询

Jmeter数据库查询参数化结果存储详解