如何定义特定于 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 中两个节点的连接的值?的主要内容,如果未能解决你的问题,请参考以下文章