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

如何在GraphQL中定义特定于两个节点连接的值?,graphql,Graphql,我的模式中有两种类型: type Resident = { type Visitor = { id id name name } } 在我的数据库中: 住户和访客表: +--------+-------+ +--------+---------+ | res_id | name | | vis_id |

我的模式中有两种类型:

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   |
+--------+--------+--------------+
每位访客可以是住户的“fam/fri”或“承包商”。所以查理是爱丽丝的访客,作为她的家人或朋友。然而,Charlie也是Bob的访客,但作为承包商

问题:我如何构建我的模式,以便在查询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"
    }                              }
  }                             }
}
比如:

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],
          }
        })
      }
    },
  },
}

还可以将枚举映射到自定义值

不清楚你在问什么。您是否在询问如何编写SQL查询以获得该结果?你是在问如何构造你的模式以便能够进行上述查询吗?对不起,我刚刚编辑了这个问题,但我的意思是如何组织我的模式。谢谢。您完全回答了我的问题,这是有道理的,但现在我不明白如何编写解析器来根据访问者的常驻父级更改关系的值。你能解释一下吗?还是我应该再问一个问题?@dannyvelasquez我编辑了我的答案,以包括一个例子,但这实际上取决于你如何获得居民和相关行。如果您仍然无法从中找到答案,请发布另一个带有更新模式和解析器代码的问题。