如何使用 GraphQL 创建一对多关系?

GBM*_*BMR 2 graphql aws-amplify

我有一个 iOS 应用程序,用户可以在其中使用后端 AWS Amplify 登录并相互发送消息。我的 API 是使用 GraphQL 配置的,目前看起来像这样。

type User @model {
  id: ID!
  userSub: String!
  fullName: String!
}
type ChatMessage @model {
  id: ID!
  senderUserSub: String
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
}

Run Code Online (Sandbox Code Playgroud)

我是 GraphQL 及其架构定义语言的新手。上面的架构有效,但是在 dynamodb 表内部没有结构,我正在尝试创建一种有效的方式来构建用户消息传递的数据。“一对多关系”是模式示例,可在配置 API 时在 Amplify CLI 中找到。我尝试复制它的示例基础我当前的一个。

默认一对多关系模式

type Blog @model {
  id: ID!
  name: String!
  posts: [Post] @connection(keyName: "byBlog", fields: ["id"])
}

type Post @model @key(name: "byBlog", fields: ["blogID"]) {
  id: ID!
  title: String!
  blogID: ID!
  blog: Blog @connection(fields: ["blogID"])
  comments: [Comment] @connection(keyName: "byPost", fields: ["id"])
}

type Comment @model @key(name: "byPost", fields: ["postID", "content"]) {
  id: ID!
  postID: ID!
  post: Post @connection(fields: ["postID"])
  content: String!
}

Run Code Online (Sandbox Code Playgroud)

我试着像这样复制它的例子。

更新架构

type User @model {
  id: ID!
  userSub: String!
  fullName: String!
  messages: [ChatMessage] @connection(keyName: "byUser", fields: ["id"])
}
type ChatMessage @model @key(name: "byUser", fields: ["messageID"]){
  id: ID!
  messageID: ID!
  senderUserSub: String
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
  user: User @connection(fields: ["messageID"])
}
Run Code Online (Sandbox Code Playgroud)

我想知道上面这个更新的架构看起来合适吗?如果可能的话,谁能给我一些关于如何正确制作消息传递的指示?我对 GraphQL SDL 没有经验。

Eng*_*gam 5

对于这种连接,您不需要使用 @key 属性。您可以为 @connection 命名,以便放大了解您指的是哪个连接,如下所示:

@connection(name: "nameOfYourConnection")
Run Code Online (Sandbox Code Playgroud)

必须在两种类型的连接属性上提供名称。

type User @model {
  id: ID!
  userSub: String
  fullName: String
  chatMessages: [ChatMessage] @connection(name: "UserChatMessageConnection") #new
}

type ChatMessage @model {
  id: ID!
  senderUserSub: String 
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: String!
  user: User @connection(name: "UserChatMessageConnection") #new
}
Run Code Online (Sandbox Code Playgroud)

运行 amplify push 后,您将看到生成的突变,当您创建 ChatMessage 对象时,您应该给它一个名为 的值chatMessagesUserId。这是用户创建 ChatMessage 的引用(用户类型上的 id)。