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

如何使用GraphQL创建一对多关系?,graphql,aws-amplify,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 me

我有一个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表中没有结构,我正在尝试为用户消息传递创建一种有效的结构化数据的方法。“一对多关系”是配置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!
}
type ChatMessage @model {
  id: ID!
  senderUserSub: String
  recieverUserSub: String
  messageText: String
  messageImageFilename: String
  dateSent: 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
}
运行amplify push后,您将在生成的突变中插入,即当您创建一个ChatMessage对象时,您应该给它一个名为
chatMessagesUserId
的值。这是用户创建ChatMessage的引用(用户类型上的id)