【发布时间】:2019-02-18 10:48:16
【问题描述】:
假设你有一个user 类型,而一个user 有很多posts。然后想象你想找到一个用户,并删除他们所有的帖子。一种方法是实现以下mutation 字段:
field deleteAllPosts, types[Types::PostType] do
argument :user_id, types.String
resolve -> (obj,args,ctx){
posts = Posts.where(user_id:args[:user_id])
posts.each{|post| post.destroy}
}
end
然后查询
mutation {
deleteAllPosts(user_id:1)
}
将删除 id 为 1 的用户的所有帖子。
在我这样做之前,我曾想过以一种不同的方式来做这件事,我还没有看到其他人这样做过。我想检查这种不同的方式是否没有任何陷阱,或者我不应该使用它的原因。
这个想法是为PostType 放置一个deletePost 字段,并为突变放置一个findUser 字段(通常是一个查询字段)。假设这些字段的定义方式很明显,那么我将进行查询
mutation{
findUser(id:1){
posts{
deletePost{
id
}
}
}
}
这是个坏主意吗?
根据反馈进行编辑:我担心的一件事是用户可以原则上将deletePost 选择放在询问。但我很想说那是“他们的错”。我喜欢说“只有在突变查询中才能进行此选择”,但我认为这在 GraphQL 中是不可能的。
为了避免XY问题,这就是为什么我热衷于使用这个想法而不是最初的想法。它感觉更有表现力(换句话说,它感觉不那么多余)。假设一段时间后,您决定删除属于特定group 的users 的所有posts。然后在我认为的“约定”中,您应该创建一个全新的突变字段:
field deleteAllPostsInGroup, types[Types::PostType] do
argument :group_id, types.String
resolve -> (obj,args,ctx){
posts = Group.find_by(args[:group_id]).users.map{|u| u.posts}.flatten
posts.each{|post| post.destroy}
}
end
而在我建议的约定中,您只需定义一个简单的 findGroup 字段(但您必须在不属于它的突变上定义它),然后进行查询:
mutation{
findGroup(id:1){
users{
posts{
deletePost{
id
}
}
}
}
}
我想我真正想做的是使用查询来查找一些数据,然后改变我找到的数据。我不知道如何在 GraphQL 中做到这一点。
第二次编辑:这个问题似乎有一个明确的组成部分,我已经问过here。事实证明,这些问题中的一个可以回答另一个问题,并且可以关闭,但我还不知道是哪种方式。
【问题讨论】:
标签: graphql