在遵循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联接将编辑器添加到帖子中,但是在他们的示例中,有此语句(我不太了解),所以我认为这不是一个好方法: / p>
# 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);
})
仍在寻找是否有办法以单突变形式传递数组。
答案 0 :(得分:0)
为简单起见,我将使用 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")
}
创建Join表
先决条件:同时获取 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