我最近一直在玩GraphQL,目前正在学习突变。我对某些事感到困惑。我有一个关系为Post
的模型Comments
。我有一个看起来像这样的突变:
mutation addCommentToPost {
updatePost(
id: "POST-1",
comments: [{
body: "Hello!"
}]
) {
id,
comments {
id,
body
}
}
}
问题是,每当我运行它时,它似乎删除所有注释并将注释设置为仅我刚刚添加的注释。更具体地说,如何将推送的变异写入comments
数组而不是替换它?
答案 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.getPost
和db.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);
}
});