如何定义特定于 GraphQL 中两个节点的连接的值?

Posted

技术标签:

【中文标题】如何定义特定于 GraphQL 中两个节点的连接的值?【英文标题】:How to define values specific to a connection of two nodes in GraphQL? 【发布时间】:2020-05-10 03:36:14 【问题描述】:

我的架构中有两种类型:

type Resident =             type Visitor = 
  id                           id
  name                         name
                            

在我的数据库中:

居民和访客表:

+--------+-------+   +--------+---------+
| res_id | name  |   | vis_id | name    |
+--------+-------+   +--------+---------+
|  1     | Alice |   |  1     | Charlie |
|  2     | Bob   |   +--------+---------+
+--------+-------+

然后是一张表格,显示哪个访客属于哪个居民:

+--------+--------+--------------+
| res_id | vis_id | relationship |
+--------+--------+--------------+
|      1 |      1 | fam/fri      |
|      2 |      1 | contractor   |
+--------+--------+--------------+

每位访客都可以是居民的“家人/朋友”或“承包商”。所以查理是爱丽丝的来访者,作为她的家人或朋友。然而,查理也是鲍勃的访客,而是作为承包商。

问题:我如何构建我的架构,以便当我查询 Alice 时,Charlie 作为 fam/fri 返回,而当我查询 Bob 时,Charlie 作为承包商返回?我想是这样的:


  Resident(id: 1)              "Resident" 
    name                           "Alice"
    Visitor                       "Visitor" 
      id                ===>          "1"
      name                            "Charlie"
      relationship                    "fam/fri"
                                  
                               

还有:


  Resident(id: 2)              "Resident" 
    name                           "Bob"
    Visitor                       "Visitor" 
      id                ===>          "1"
      name                            "Charlie"
      relationship                    "contractor"
                                  
                               

【问题讨论】:

不清楚你在这里问什么。您是否在问如何编写 SQL 查询来获得该结果?您是在问如何构建架构以进行上述查询? 抱歉,我刚刚编辑了问题,但我的意思是如何组织我的架构。 【参考方案1】:

类似:

type Query 
  resident(id: Int): Resident


type Resident 
  id: Int!
  name: String!
  visitors: [Visitor!]!


type Vistor 
  id: Int!
  name: String!
  relationship: VisitorRelationship!


enum VisitorRelationship 
  CONTRACTOR
  FAMILY_OR_FRIEND

请注意,按照约定,字段名称应为 camelCase,类型名称应为 PascalCase。如果从您的数据源(无论是数据库、API 还是其他)返回的数据与您希望从 GraphQL 服务返回的数据不同,那么您应该先转换数据,然后再将其返回到解析器中,例如示例:

const relationshipMap = 
  'fam/fri': 'FAMILY_OR_FRIEND',
  'contractor': 'CONTRACTOR',


const resolvers = 
  Query: 
    resident: (root, args) => 
      const resident = await Resident.findById(args.id)
      // assuming resident has a property named joinTable that's
      // an array and each relationship has a property named visitor
      return 
        ...resident,
        visitors: resident.joinTable.map(relationship => 
          return 
            ...joinTable.visitor,
            relationship: relationshipMap[joinTable.relationship],
          
        )
      
    ,
  ,

您还可以将枚举映射到自定义值this way。

【讨论】:

谢谢。您准确地回答了我的要求,这是有道理的,但是现在我不知道如何编写解析器来根据访问者的 Resident 父级更改关系的值。你能在这里解释一下吗?还是我应该再提一个问题? @dannyvelasquez 我编辑了我的答案以包含一个示例,但这实际上取决于您如何获得居民和相关行。如果您仍然无法从中弄清楚,请使用更新的架构和解析器代码发布另一个问题。

以上是关于如何定义特定于 GraphQL 中两个节点的连接的值?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 将类添加到特定于节点类型的行

如何在 Spring Cloud Gateway 中添加特定于路由的自定义过滤器

如何使用特定于州的代理?

您如何在 Meteor 中存储特定于客户端的数据服务器端?

初入MAUI如何添加特定于平台的自定义,2种方式,多种语法

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名