如何创建推送到阵列而不是替换它的突变?

时间:2017-06-16 18:47:34

标签: graphql

我最近一直在玩GraphQL,目前正在学习突变。我对某些事感到困惑。我有一个关系为Post的模型Comments。我有一个看起来像这样的突变:

mutation addCommentToPost {
  updatePost(
    id: "POST-1",
    comments: [{
      body: "Hello!"
    }]
  ) {
    id,
    comments {
      id,
      body
    }
  }
}

问题是,每当我运行它时,它似乎删除所有注释并将注释设置为仅我刚刚添加的注释。更具体地说,如何将推送的变异写入comments数组而不是替换它?

3 个答案:

答案 0 :(得分:2)

您正在使用名为updatePosts的变种,我假设(基于名称)只是通过替换传递的字段来更新帖子。如果您想使用updatePosts突变添加评论,首先必须查询帖子以获取当前评论列表,将评论添加到最后,然后使用updateComment调用整个评论列表(包括您刚刚添加到评论中的评论)。

然而,这并不是一个好的解决方案,特别是如果评论列表可能很长。如果您能够更改GraphQL 服务器,则应在服务器上使用addComment(postId: ID, comment: CommentInput)之类的签名创建新突变。在该变异的resolve函数中,只需添加传递给当前注释列表末尾的注释。

// resolver for addComment:
addComment(root, args) {
  // validate inputs here ...

  const post = db.getPost(args.postId);
  post.comments.append(args.comment);
  db.writePost(post.id, post);
}

db.getPostdb.writePost是您必须定义的函数,用于从存储它的任何位置检索/写入帖子。

值得注意的是,与SQL或Mongo查询不同,没有resolve函数,GraphQL变异本身没有任何意义。突变的作用是在其解析函数中定义完全。变异名称和参数只与resolve函数一起获得意义。由您(或您公司的GraphQL服务器开发人员)编写解析函数。

答案 1 :(得分:1)

Graphcool API目前解决此问题的方法是对链接到Comment的{​​{1}}使用创建变异。这称为nested connect mutation

这就是它的样子:

Post

将来可以引入其他嵌套参数,例如mutation { createComment( text: "Hello!" postId: "POST-1" ) { id text post { comments { id } } } } comments_set,然后推送就可以这样:

comments_push

披露:我在Graphcool工作。

答案 2 :(得分:-2)

您可以使用这些代码作为变异的示例。

module.exports = (refs) => ({
  type: refs.commentType,
  args: {
    id: {
      type: GraphQLString
    },
    body: {
      type: GraphQLString
    }
  },
  resolve: (parent, args, root) => {
    return createUser(args);
  }
});