联接表上的高效GraphQL查询

时间:2018-08-19 19:11:14

标签: sequelize.js graphql

我来设置。

  • 后端:节点,GraphQL,与PostGRES数据库续集。
  • 前端: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 < / strong>)。


我的两个问题

  1. 前端:我可以查询成员表(allMembers),并映射每行的角色,电子邮件和eventId。 但是如何显示事件名称(是的,这是事件模型的一部分)。出于显示目的,eventId对最终用户显然毫无意义。
  2. 前端::一旦用户看到了他们所属的事件列表,我希望他们能够单击事件-将事件的ID置于状态。这样,我可以将该eventId用于其他查询。 对实现此目标的最佳方法有何建议?

1 个答案:

答案 0 :(得分:0)

我会指出您指向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就足够了。