连接表上的高效 GraphQL 查询
Posted
技术标签:
【中文标题】连接表上的高效 GraphQL 查询【英文标题】:Efficient GraphQL query on a join table 【发布时间】:2019-01-26 00:10:31 【问题描述】:我会设置的。
后端:Node、GraphQL、使用 PostGRES DB 进行 Sequelize。 前端:React、GraphQL。 我有用户、事件和成员的模型。 一个用户可以属于许多不同的事件。 一个事件可以有很多用户。 对于每个事件,用户都有特定的角色。我正在通过 Sequelize 动态创建一个成员连接表,如下所示:
`Event.belongsToMany(models.User,
through: models.Member,
foreignKey:
name: "eventId",
field: "event_id"
);`
`User.belongsToMany(models.Event,
through: models.Member,
foreignKey:
name: "email",
field: "email"
);`
我的会员型号代码确实有一个独特的字段role
。该文件如下所示:
`export default (sequelize, DataTypes) =>
const Member = sequelize.define("member",
role: DataTypes.STRING
);
return Member;
;`
最后,我有一个包含 role 字段的成员表,以及与用户 (email) 以及事件 (eventId)。
我的两个问题
-
前端:我可以查询成员表(allMembers),并通过每一行的角色、电子邮件和 eventId 进行映射。 但是如何显示事件名称?(是的,它是我的事件模型的一部分)。出于显示目的,eventId 显然对最终用户毫无意义。
前端:一旦用户看到他们所属的事件列表,我希望他们能够点击一个事件——将该事件的 id 置入状态。这样,我可以将该 eventId 用于其他查询。 对实现这一目标的最佳方法有什么建议吗?
【问题讨论】:
【参考方案1】:我会把你指向GraphQL Relay。在 GraphQL 中,您将拥有:
interface Node
id: ID!
type Member implements Node
id: ID!
role: Role!
email: String!
event: Event!
type Event implements Node
id
...whatever
type Role
...whatever this has
type Query
node: Node
member: Member
你会查询:
query GetPerson
member
id
email
role
...whatever fields on role
event
id
name
在所有这些情况下,“id”都是“NodeId”,它是 : 的 base64 编码值。例如RXZlbnQ6MTIzNDU2Nzg5MA==
将是 ID 为 1234567890
的事件的 ID。这将为您提供足够的信息来显示您的第一个视图。然后,为了显示您的第二个视图,您将进行查询:
query GetEvent
node(id:"RXZlbnQ6MTIzNDU2Nzg5MA==")
... on Event
name
address
whatever
这为您提供了足够的信息来获取第二个视图的数据。在服务器上,query.node 解析器 base64 将您传入的 id
解码为 Event:1234567890
,然后生成一些 getEventById("1234567890")
并返回该新对象的内容。
请记住:您从 GraphQL 获得的价值来自您的数据点之间的关系。您可以尽可能多地嵌套它们,并询问构建视图所需的一切,以及绘制下一个视图所需的 ID。如果您想一次获取一个对象,REST 就足够了。
【讨论】:
以上是关于连接表上的高效 GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章