AWS AppSync-使用1-M @连接和加入的@model

时间:2019-11-13 10:41:57

标签: database amazon-web-services graphql aws-amplify aws-appsync

在遵循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);
    })

仍在寻找是否有办法以单突变形式传递数组。

1 个答案:

答案 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.idproject.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