【问题标题】:Result of a delete mutation?删除突变的结果?
【发布时间】:2017-10-22 13:13:29
【问题描述】:

Graphql 中删除突变的结果应该是什么?我正在使用 graphql-ruby gem。这是我的突变示例,但我不确定我应该返回什么作为响应。

Mutations::Brands::Delete = GraphQL::Relay::Mutation.define do
  name "DeleteBrand"
  description "Delete a brand"

  input_field :id, types.ID

  # return_field ??

  resolve ->(object, inputs, ctx) {
    brand = Brand.find(inputs[:id])
    brand.destroy
  }
end

【问题讨论】:

  • 我认为最佳做法是准确返回您删除的内容,以便 graphql 知道需要删除的内容。

标签: graphql graphql-ruby


【解决方案1】:

我认为截至 2017 年 7 月尚不存在明确的事实标准,并且我发现实现之间存在很多差异(GitHub、Yelp、GraphCool、Shopify)。

但是,如果您看一下最近出现的一些 GraphQL API,似乎有一个共同的趋势。很大程度上,输入类型和响应类型是特定于突变的。例如,对于updateBrand 突变,您可能期望得到UpdateBrandInput,并返回UpdateBrandPayload 响应。请注意,输入不是BrandInput,而是以Brand 响应。您也不会使用标量布尔值(例如,true,如果成功)或已删除实体的 id(在删除突变的情况下)进行响应。按照这个约定,你可以有一个createBrand 突变,一个CreateBrandInput 和一个CreateBrandPayload 响应。

通过创建特定于突变的inputpayload 类型,您可以在期望和响应的领域拥有很大的灵活性。每次删除,您可能会有一个 DeleteBrandPayload 响应,其中不仅包括品牌的浅层(例如仅标量)字段,还包括其他相关数据(例如 clientMutationId)等。

老实说,我认为 GraphQL 规范提供了足够的绳索来吊死你自己,所以看看一些大人物是如何推出的是明智的。

【讨论】:

  • 有趣的事情:我正在寻找这个答案(谢谢,它非常有用),碰巧,我正在处理的突变被命名为“createBrand”、“updateBrand”和“删除品牌”:D
  • 如果有一些你所说的“大人物”代码示例的链接会很有趣,他们有几十个存储库
  • 你可以在这里docs.github.com/en/graphql/overview/explorer 尝试来自 Github 的 GraphQL API(你必须登录),他们使用这个命名:DeleteBrandInputDeleteBrandPayload
【解决方案2】:

您可以返回 deleted_id 或消息。如果它是关联对象,您可以返回更新的对象,如下例所示。

Destroy = GraphQL::Relay::Mutation.define do
name 'DestroyComment'
description 'Delete a comment and return post and deleted comment ID'

# Define input parameters
input_field :id, !types.ID

# Define return parameters
return_field :deletedId, !types.ID
return_field :article, ArticleType
return_field :errors, types.String

resolve ->(_obj, inputs, ctx) {
  comment = Comment.find_by_id(inputs[:id])
  return { errors: 'Comment not found' } if comment.nil?

  article = comment.article
  comment.destroy

  { article: article.reload, deletedId: inputs[:id] }
}

http://tech.eshaiju.in/blog/2017/05/15/graphql-mutation-query-implementation-ruby-on-rails/

【讨论】:

  • 这不会导致内存膨胀吗? @eshaiju
猜你喜欢
  • 2021-08-08
  • 2018-07-17
  • 2016-09-03
  • 1970-01-01
  • 2022-01-17
  • 2020-04-11
  • 2016-08-08
  • 2019-08-21
  • 2017-11-10
相关资源
最近更新 更多