AWS AppSync - 使用 1-M @connections 和加入 @model 实现多对多连接
Posted
技术标签:
【中文标题】AWS AppSync - 使用 1-M @connections 和加入 @model 实现多对多连接【英文标题】:AWS AppSync - Implement many to many connections using 1-M @connections and a joining @model 【发布时间】:2020-03-09 03:28:19 【问题描述】:按照 AWS 文档 (https://aws-amplify.github.io/docs/cli-toolchain/graphql > 多对多连接),我尝试了解它们为多对多连接提供的解决方法示例(Amplify 似乎还不支持)。
架构是:
type Post @model
id: ID!
title: String!
editors: [PostEditor] @connection(name: "PostEditors")
# Create a join model and disable queries as you don't need them
# and can query through Post.editors and User.posts
type PostEditor @model(queries: null)
id: ID!
post: Post! @connection(name: "PostEditors")
editor: User! @connection(name: "UserEditors")
type User @model
id: ID!
username: String!
posts: [PostEditor] @connection(name: "UserEditors")
使用 AWS AppSync 控制台,到目前为止,我能够:
使用此突变创建用户:
mutation
createUser(input:
username: "theUserName"
)
username
使用此突变创建帖子:
mutation
createPost(input:
title: "second post"
)
title
但我不明白如何在帖子中添加多个编辑器?到目前为止,我可以使用 PostEditor join 将编辑器添加到帖子中,但是在他们的示例中,有这个语句(我不太理解),所以我认为这不是好方法:
# Create a join model and disable queries as you don't need them
# and can query through Post.editors and User.posts
所以我想使用这个连接模型来执行突变不是我必须做的。尽管如此,为了能够在帖子和编辑器之间创建这种关系,我创建了一个突变(从之前的两个突变中检索“postEditorPostId”和“postEditorEditorId”):
mutation
createPostEditor(input:
postEditorPostId: "XXX-XXX-XXX"
postEditorEditorId: "YYY-YYY-YYY"
)
post
title
editor
username
posts
items
post
title
每次添加新编辑器时是否需要执行此先前的更改(因此更改将保持不变但“postEditorEditorId”会更改?这显然不是一种可扩展的方法,例如,如果 UI 允许管理员添加50 个或更多新编辑器(因此需要 50 个突变)。
我终于可以使用这个查询获得我需要的信息了:
query
getUser(id: "YYY-YYY-YYY")
username
posts
items
post
title
有没有更好的方法(我想)给帖子添加编辑器?
编辑:
使用承诺,我可以在帖子中添加多个编辑器,但它涉及到随着用户数量的变化执行突变:
const users = [id: "U1", username: "user1", id: "U2", username: "user2"];
const post = id: "P1", title: "Post 1" ;
/*
After creating two users and a post using the approriate mutations
Using the CreatePost join below to make user1 and user2 editor on Post 1
*/
function graphqlCreatePostEditor(editorID)
return new Promise((resolve, reject) =>
resolve(
API.graphql(graphqlOperation(createPostEditor,
input:
postID: post.id,
))
)
)
let promises = users.map(user=>
return graphqlCreatePostEditor(user.id)
.then(e =>
console.log(e)
return e;
)
);
Promise.all(promises)
.then(results =>
console.log(results)
)
.catch(e =>
console.error(e);
)
仍在寻找是否有办法在单一突变中传递数组。
【问题讨论】:
只是想知道您是否曾经想出一个好方法来做到这一点? 【参考方案1】:为简单起见,我可以使用User
模型和Project
模型,其中用户可以拥有许多项目并属于许多项目。
注意:我在这里描述的连接表的创建是针对 React / React Native / javascript 的 Amplify JS API
用户模型
type User @model
id: ID!
username: String!
projects: [UserProject] @connection(name: "UserProject")
项目模型
type Project @model
id: ID!
project_title: String!
users: [UserProject] @connection(name: "ProjectUser")
加入表
type UserProject @model
id: ID!
user: User @connection(name: "UserProject")
project: Project @connection(name: "ProjectUser")
连接表的创建
先决条件:同时获取 user.id
和 project.id
,但你想这样做。
const UserProjectDetails =
userProjectUserId: user.id
userProjectProjectId: project.id
;
API.graphql( query: mutations.createUserProject, variables: input: UserProjectDetails)
你有它。
dev.to 上的这篇文章也直截了当:
https://dev.to/norrischebl/modeling-relationships-join-table-graphql-aws-amplify-appsync-1n5f
【讨论】:
以上是关于AWS AppSync - 使用 1-M @connections 和加入 @model 实现多对多连接的主要内容,如果未能解决你的问题,请参考以下文章
将 AWS Appsync 与 AWS Neptune 结合使用
如何使用 AWS appsync (GraphQL) 禁用自省查询?
如何使用 IAM 在 AWS Lambda 中调用 AppSync?