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

Posted

技术标签:

【中文标题】如何使用 GraphQL 创建一对多关系?【英文标题】:How to create a one to many relationship using GraphQL? 【发布时间】:2020-10-27 04:47:58 【问题描述】:

我有一个 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!
  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 没有经验。

【问题讨论】:

【参考方案1】:

这种连接不需要使用@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)。

【讨论】:

以上是关于如何使用 GraphQL 创建一对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤graphQL一对多关系中的查询?

如何在graphql突变中设置多对多关系?

如何使用 AppSync GraphQL 转换为一对多 @connection 执行 @auth?

如何使用 JDBI SQL 对象 API 创建一对多关系?

如何使用 AppSync GraphQL 转换为双向一对多 @connection 执行字段级别 @auth?

使用 laravel,我如何创建一个将更新一对多关系的视图?