每次删除都需要一个单独的突变吗?
Do I need a separate mutation for every delete?
所以我正在构建一个 React/Apollo 应用程序,但我有点难以删除内容。
在我的 Redux 应用程序中,我的 'delete' 操作只是将对象类型和 ID 传递到我的化简器,我在化简器中从我的规范化状态中删除对象。这样,我可以对所有对象使用相同的 'delete' action/component/reducer。整洁!
在 Apollo 中,我需要选择一个引用该对象的查询,并在 update
函数中 read/write 到它,对吗?就像我要删除 Person
一样,我需要找到一些包含 Persons
的随机查询并使用它吗?
只有一个查询获取所有内容,然后从那里删除对象是否是一种不好的做法?或者我可以将它从 Apollo 将所有内容规范化到的地方删除吗?
我认为它有点违背了 GraphQL 的目的,即拥有一个包含每个实体的 GET_EVERYTHING
查询,但替代方案听起来像是一团糟。
通常每个 type/node 有一个删除突变。例如。 deleteUser、deleteBook、deleteMessage 等。这些变更的输入通常是一个 ID,如果您希望能够一次删除多个条目,则可以是一个 ID 列表。
如果您希望能够通过单个突变删除任何类型的对象,您也可以使用 deleteNode 突变。然后,您应该使所有可删除类型都继承自节点类型 - 并确保 ID 在所有类型之间真正唯一。
包含每个实体的删除突变和按节点的一般删除的示例:
interface Node {
id: ID!
}
type Person implements Node {
id: ID!
firstName: String!
lastName: String!
}
type Book implements Node {
id: ID!
title: String!
author: String!
}
union NodeEntity = Person | Book
type Query {
person(id: ID!): Person
persons: [Person!]! # You may want to limit the number of returned items
# ... same thing for Book
node(id: ID!): Node
nodes: [Node!]! # You may want to limit the number of returned items
}
type Mutation {
createPerson(input: CreatePersonInput!): CreatePersonPayload!
updatePerson(input: UpdatePersonInput!): UpdatePersonPayload!
deletePerson(input: DeletePersonInput!): DeletePersonPayload!
# ... same thing for Book
deleteNode(input: DeleteNodeInput!): DeleteNodePayload!
# or simply:
# deleteNode(id: String!): Boolean!
}
# Mutation inputs
input CreatePersonInput {
firstName: String!
lastName: String!
}
input UpdatePersonInput {
personId: ID!
firstName: String
lastName: String
}
input DeletePersonInput {
personId: ID!
}
input DeleteNodeInput {
nodeId: ID!
}
# Mutation results
type CreatePersonPayload {
person: Person!
}
type UpdatePersonPayload {
person: Person!
}
type DeletePersonPayload {
person: Person!
}
type DeleteNodePayload {
node: NodeEntity!
# or simply:
# node: Node
}
希望对您有所帮助!
所以我正在构建一个 React/Apollo 应用程序,但我有点难以删除内容。
在我的 Redux 应用程序中,我的 'delete' 操作只是将对象类型和 ID 传递到我的化简器,我在化简器中从我的规范化状态中删除对象。这样,我可以对所有对象使用相同的 'delete' action/component/reducer。整洁!
在 Apollo 中,我需要选择一个引用该对象的查询,并在 update
函数中 read/write 到它,对吗?就像我要删除 Person
一样,我需要找到一些包含 Persons
的随机查询并使用它吗?
只有一个查询获取所有内容,然后从那里删除对象是否是一种不好的做法?或者我可以将它从 Apollo 将所有内容规范化到的地方删除吗?
我认为它有点违背了 GraphQL 的目的,即拥有一个包含每个实体的 GET_EVERYTHING
查询,但替代方案听起来像是一团糟。
通常每个 type/node 有一个删除突变。例如。 deleteUser、deleteBook、deleteMessage 等。这些变更的输入通常是一个 ID,如果您希望能够一次删除多个条目,则可以是一个 ID 列表。
如果您希望能够通过单个突变删除任何类型的对象,您也可以使用 deleteNode 突变。然后,您应该使所有可删除类型都继承自节点类型 - 并确保 ID 在所有类型之间真正唯一。
包含每个实体的删除突变和按节点的一般删除的示例:
interface Node {
id: ID!
}
type Person implements Node {
id: ID!
firstName: String!
lastName: String!
}
type Book implements Node {
id: ID!
title: String!
author: String!
}
union NodeEntity = Person | Book
type Query {
person(id: ID!): Person
persons: [Person!]! # You may want to limit the number of returned items
# ... same thing for Book
node(id: ID!): Node
nodes: [Node!]! # You may want to limit the number of returned items
}
type Mutation {
createPerson(input: CreatePersonInput!): CreatePersonPayload!
updatePerson(input: UpdatePersonInput!): UpdatePersonPayload!
deletePerson(input: DeletePersonInput!): DeletePersonPayload!
# ... same thing for Book
deleteNode(input: DeleteNodeInput!): DeleteNodePayload!
# or simply:
# deleteNode(id: String!): Boolean!
}
# Mutation inputs
input CreatePersonInput {
firstName: String!
lastName: String!
}
input UpdatePersonInput {
personId: ID!
firstName: String
lastName: String
}
input DeletePersonInput {
personId: ID!
}
input DeleteNodeInput {
nodeId: ID!
}
# Mutation results
type CreatePersonPayload {
person: Person!
}
type UpdatePersonPayload {
person: Person!
}
type DeletePersonPayload {
person: Person!
}
type DeleteNodePayload {
node: NodeEntity!
# or simply:
# node: Node
}
希望对您有所帮助!