连接表上的高效 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

@connection 上的 AWS Amplify Graphql 查询

编写graphql服务

使用 graphql 查询连接 3 个表

如何使用 GraphQL 上的自定义字段查询?

使用 Apollo 批量递归查询(graphql)

GraphQL 模型上的多个查询