我最近一直在玩GraphQL,目前正在学习突变。我有点糊涂了。我有一个带有relation Comments
的模型Comments
。我有一个突变,看起来像这样:
mutation addCommentToPost {
updatePost(
id: "POST-1",
comments: [{
body: "Hello!"
}]
) {
id,
comments {
id,
body
}
}
}
问题是,每当我运行这个程序时,它似乎会删除所有的注释,并将注释设置为我刚才添加的注释。更确切地说,我如何编写一个插入comments
数组而不是替换它的变异?
发布于 2017-06-17 19:01:38
您正在使用名为updatePosts
的突变,我假设它(基于名称)只是通过替换传递的字段来更新post。如果要使用updatePosts
突变添加注释,首先必须查询帖子才能获得当前的注释列表,然后将注释添加到末尾,然后使用整个注释列表(包括刚才添加到末尾的注释)调用updateComment
。
然而,这并不是一个很好的解决方案,特别是如果评论列表很长的话。如果您有能力更改GraphQL 服务器,您应该在服务器上创建一个新的突变,其签名类似于addComment(postId: ID, comment: CommentInput)
。在该突变的解析函数中,只需添加传递到当前注释列表末尾的注释即可。
// 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查询不同的是,没有解析函数,GraphQL突变本身就没有任何意义。突变所做的是在它的解析函数中定义完全。突变名和参数只与解析函数一起获得意义。应该由您(或公司的GraphQL服务器开发人员)编写解决函数。
发布于 2017-06-18 13:44:16
目前在Graphcool中解决这种情况的方法是为链接到Post
的Comment
使用创建突变。这叫做嵌套连接突变。
这就是它的样子:
mutation {
createComment(
text: "Hello!"
postId: "POST-1"
) {
id
text
post {
comments {
id
}
}
}
}
在将来,可以引入其他嵌套参数,如comments_set
或comments_push
,然后就可以这样推送:
mutation addCommentToPost {
updatePost(
id: "POST-1",
comments_push: [{
body: "Hello!"
}]
) {
id,
comments {
id,
body
}
}
}
披露:我在石墨酷公司工作。
发布于 2017-06-17 17:15:04
您可以使用这些代码作为突变的示例。
module.exports = (refs) => ({
type: refs.commentType,
args: {
id: {
type: GraphQLString
},
body: {
type: GraphQLString
}
},
resolve: (parent, args, root) => {
return createUser(args);
}
});
https://stackoverflow.com/questions/44596074
复制相似问题