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.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

【讨论】:

以上是关于AWS AppSync - 使用 1-M @connections 和加入 @model 实现多对多连接的主要内容,如果未能解决你的问题,请参考以下文章

将 AWS Appsync 与 AWS Neptune 结合使用

如何使用 AWS appsync (GraphQL) 禁用自省查询?

将 aws-appsync 与 nextjs 连接

如何使用 IAM 在 AWS Lambda 中调用 AppSync?

使用 AWS Amplify/AppSync 的嵌套 GraphQL 突变

AWS Appsync Javascript 查询示例和输入语法