【问题标题】:AWS Amplify and GraphQL InterfacesAWS Amplify 和 GraphQL 接口
【发布时间】:2020-07-01 08:24:17
【问题描述】:

您将如何处理接口并将它们用于使用 AWS Amplify 模型转换的数据模型中的连接?

interface User @model {
  id: ID
  email: String
  created: AWSTimestamp
}

type ActiveUser implements User {
  id: ID
  first: String
  last: String
  email: String
  created: AWSTimestamp
}

type InvitedUser implements User {
  id: ID
  email: String
  created: AWSTimestamp
  invitedBy: String
}

type Team @model {
  users: [User] @connection
}

似乎我的选择是将 @model 放在类型上,但是一旦运行放大更新 api,我就会在 Query 上获得单独的 Dynamo 表和查询。

转换器能否支持此处记录的接口:https://docs.aws.amazon.com/appsync/latest/devguide/interfaces-and-unions.html

我还找到了一些支持票,但想知道是否有任何东西可以启用此功能。以下是我找到的支持票:

https://github.com/aws-amplify/amplify-cli/issues/1037

https://github.com/aws-amplify/amplify-cli/issues/202

【问题讨论】:

    标签: interface graphql aws-amplify aws-appsync


    【解决方案1】:

    我认为您可以将公共字段保留在 User 中,并将额外信息保留在单独的类型中。不确定这是否是最佳做法,但它应该适用于这种情况

    enum UserType {
      ACTIVE
      INVITED
    }
    
    type User @model @key(name:"byTeam", fields:["teamID"]){
      id: ID!
      teamID: ID!
      email: String
      created: AWSTimestamp
      type: UserType
      activeUserInfo: ActiveUserInfo @connection(fields:["id"])
      invitedUserInfo: InvitedUserInfo @connection(fields:["id"])
    
    }
    
    type ActiveUserInfo @key(fields:["userID"]){
      userID: ID!
      first: String
      last: String
    }
    
    type InvitedUserInfo @key(fields:["userID"]){
      userID: ID!
      invitedBy: String
    }
    
    type Team @model {
      id:ID!
      users: [User!] @connection(keyName:"byTeam", fields:["id"])
    }
    

    【讨论】:

      【解决方案2】:

      您只使用@connection 将两个数据库链接在一起(必须由type 而不是interface),所以如果您不想这样做,那么只需去掉@connection 和Team 数据库将简单地将用户类型设为 [User]。我不完全是你想要做的,但我会做类似的事情:

      type User @model {
        id: ID
        first: String!
        last: String!
        email: String!
        created: AWSTimestamp
        isActive: boolean
        invitedBy: String
        team: Team @connection(name: "UserTeamLink")
      }
      
      type Team @model {
        users: [User!] @connection(name: "UserTeamLink")
      }
      

      在创建新用户时需要字段 first、last 和 email 的位置,您可以使用布尔值区分活动用户,当您查询 User 数据库时,它也会从 Team 数据库中返回 Team 项目(我猜你想要其他字段,比如团队名称等?),所以当你创建一个 Team 对象时,你会传入 teamUserId(下面没有显示,但在使用放大时创建),这将允许你将一个新创建的 Team 附加到现有用户或用户组。

      【讨论】:

        猜你喜欢
        • 2020-04-08
        • 2019-09-07
        • 2022-01-02
        • 2020-04-05
        • 2020-08-12
        • 2020-03-27
        • 2021-08-31
        • 2022-08-17
        • 2021-10-13
        相关资源
        最近更新 更多