如何使用 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 创建一对多关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AppSync GraphQL 转换为一对多 @connection 执行 @auth?