GraphQL 中的双向获取

Posted

技术标签:

【中文标题】GraphQL 中的双向获取【英文标题】:Bidirectional fetching in GraphQL 【发布时间】:2015-12-20 11:53:23 【问题描述】:

我有以下 GraphQL 架构:

interface Node 
  id: ID!


type User : Node 
  id: ID!
  name: String!
  tasks: [Task]


type Task : Node 
  id: ID!
  day: Int!
  description: String!


type Viewer 
  users: [User]


type Query 
  viewer: Viewer

基本上,每个用户都可以拥有一个任务列表。当我需要获取所有任务的列表以获得这样的响应时,就会出现问题:

tasks: [
  day: 1,
  user: 
    name: "John"
  
, 
  day: 2,
  user: 
    name: "Jane"
  
]

我应该如何编辑我的架构以允许这样的获取?

【问题讨论】:

【参考方案1】:

为了能够获取所有任务的列表,请将其作为属性添加到查看器

type Viewer 
  users: [User]
  tasks: [Task]

并将users 字段添加到Task

type Task : Node 
  id: ID!
  day: Int!
  description: String!
  users: [User]

使用更新的架构,您可以查询所有用户和任务的列表:


  viewer 
    users   // all users
      name
      tasks   // user's tasks
        description
      
    
    tasks   // all tasks
      day
      users   // task's users
        name
      
    
  

此外,您应该使用分页而不是一次获取所有任务(或用户)。如果您打算将 GraphQL 服务器与 Relay 一起使用,请不要将您的用户/任务定义为列表,而是定义为带有边缘的连接。见https://facebook.github.io/relay/docs/graphql-connections.html#content

【讨论】:

以上是关于GraphQL 中的双向获取的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AppSync GraphQL 转换为双向一对多 @connection 执行字段级别 @auth?

尝试获取数据时GraphQL中的空值[重复]

如何通过 GraphQL 中的过滤器和顺序动态创建/获取数据?

如何从数据库中获取 Graphql 中的分页游标?

无法摆脱 graphql-spqr-spring-boot-starter 中的“获取数据时异常(/apiName)”

如何从数据库中为graphql中的解析器获取数据