【问题标题】:AWS AppSync Schema - Arrays of Connections Both DirectionsAWS AppSync 架构 - 双向连接数组
【发布时间】:2022-01-13 20:53:25
【问题描述】:

我的问题是我需要在两个模式模型之间建立连接,其中每个模型都链接到另一个数组。这里的场景是我有多个Location,每个Location 有多个Staff。每个Staff 还可以有多个Location,它们被授权在。

我在文档中没有看到这样做的方法。最初我有每个Location 和多个Staff,但这将每个Staff 限制为1 个Location。我正在玩弄altLocationNames 作为每个Staff 的字符串数组的想法,但是如果需要altLocationNames,这将需要我对所有Staff 或所有Locations 执行额外的查询。

有没有人知道一个聪明的方法来做到这一点,或者甚至只是让我在Location 获得所有Staff 以及为特定Staff 获得所有Locations 的最佳方法?

架构:

type Staff
  @model
  @auth(rules: [{ allow: private, provider: iam }, { allow: private, provider: userPools }])
  @key(fields: ["email"])
  @key(name: "byId", fields: ["id"], queryField: "listStaffsById")
  @key(name: "byLocation", fields: ["locationName", "recordedAt"], queryField: "listStaffsByLocation")
  @key(name: "byRole", fields: ["role", "recordedAt"], queryField: "listStaffsByRole")
  @key(name: "byStatus", fields: ["status", "recordedAt"], queryField: "listStaffsByStatus") {
  email: AWSEmail!
  altEmails: [AWSEmail]
  id: ID!
  locationName: String!
  location: Location @connection(fields: ["locationName"])
  altLocationNames: [String]
  firstName: String
  lastName: String
  role: StaffRole
  status: StaffStatus
  recordedAt: AWSDateTime!
  createdAt: AWSDateTime!
  updatedAt: AWSDateTime!
}

type Location
  @model
  @auth(rules: [{ allow: private, provider: iam }, { allow: private, provider: userPools }])
  @key(fields: ["name"]) {
  name: String!
  subdomain: String
  address: String
  phone: String
  email: AWSEmail
  staff: [Staff] @connection(keyName: "byLocation", fields: ["name"])
  createdAt: AWSDateTime!
  updatedAt: AWSDateTime!
}

【问题讨论】:

  • 听起来您的问题与 Amplify 指令有关,而不是与底层 AppSync 相关。我在问题中添加了 [aws-amplify] 标签。
  • 我不相信这是 Amplify 特定的,实际上比 AWS 更多的 GraphQL,但我只使用 GQL 和 AppSync,所以我不确定这里是否存在语法差异。
  • @connection@model@key@authAmplify-only directives。 Amplify 使用它们来构建您的 DynamoDB 表和 AppSync GraphQL 架构/解析器。 AppSync 中不存在这些指令,您可以在其中编写自己的解析器。
  • 啊,我明白了,谢谢你的澄清。一旦我的待办事项列表变短,我需要回去学习 graphql 基础知识。

标签: amazon-web-services graphql aws-amplify aws-appsync


【解决方案1】:

您能否在 location 和 staff 表之间创建中间表并通过该表获取。 示例:

type Staff
  @model {
  id: ID!
  name: String
  locations: [StaffLocation] @connection(keyName: "staffLocationByStaffId", fields: ["id"])
}
type Location
  @model {
  id: ID!
  name: String
  staffs: [StaffLocation] @connection(keyName: "staffLocationByLocationId", fields: ["id"])
}
type StaffLocation
  @key(name: "staffLocationByStaffId", fields: ["staffId"])
  @key(name: "staffLocationByLocationId", fields: ["locationId"])
  @model {
  id: ID!
  staffId: ID!
  locationId: ID!
  staff: Staff @connection(fields: ["staffId"])
  location: Location @connection(fields: ["locationId"])
}

【讨论】:

  • 让我们确保我理解这一点。 StaffLocation 基本上是一个独特的员工和位置组合表。示例:詹姆斯/西雅图、詹姆斯/波特兰、约翰/西雅图、约翰/亚特兰大。如果我查询 Staff James 的列表,我会得到 J/S 和 J/P 以及它们的连接。如果我按位置西雅图查询列表,我会得到 J/S 和 J/S。我认为这可能是唯一的解决方法,尽管需要数据复制。人员和位置的这种场景至少应该是相对少量的数据。这还需要定期将 Staff 和 Location 表同步到 StaffLocation
猜你喜欢
  • 2019-12-29
  • 2019-12-11
  • 2018-07-29
  • 2020-02-16
  • 2019-11-03
  • 2022-11-13
  • 2020-07-24
  • 2021-03-08
  • 2019-09-22
相关资源
最近更新 更多