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

How to create a one to many relationship using GraphQL?

我有一个 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!
}

我是 GraphQL 及其架构定义语言的新手。上面的模式有效,但是在 dynamodb table 内部没有结构,我正在尝试创建一种有效的方式来为用户消息传递构建数据。 “一对多关系”是在配置 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!
}

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

更新架构

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"])
}

我想知道上面这个更新后的架构是否合适?如果可能的话,任何人都可以指导我如何正确地进行消息传递吗?我对 GraphQL SDL 没有经验。

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

@connection(name: "nameOfYourConnection")

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

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
}

在你有 运行 放大推送后,你将在生成的突变中看到,当你创建一个 ChatMessage 对象时,你应该给它一个名为 chatMessagesUserId 的值。这是用户创建 ChatMessage 的参考(用户类型上的 ID)。