【问题标题】:Efficient GraphQL query on a join table连接表上的高效 GraphQL 查询
【发布时间】: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)。


我的两个问题

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

【问题讨论】:

    标签: sequelize.js graphql


    【解决方案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 就足够了。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2017-04-18
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2018-05-11
      • 1970-01-01
      相关资源
      最近更新 更多