首页 文章

每次删除都需要单独的变异吗?

提问于
浏览
0

所以我正在构建一个React / Apollo应用程序,我有点卡在删除的东西上 .

在我的Redux应用程序中,我的'delete'操作只是将对象类型和ID传递给我的reducer,在那里我将对象从我的规范化状态中删除 . 这样,我可以对所有对象使用相同的'delete'动作/组件/ reducer . 整齐!

在Apollo中,我需要选择一个引用该对象的查询,并在 update 函数中读/写它,对吧?就像我删除 Person 一样,我需要找一些包含 Persons 的随机查询并使用它?

只有一个查询可以获取所有内容,然后从那里删除对象,这是不好的做法吗?或者我可以将它从阿波罗规范化的所有地方删除吗?

我认为它有点挫败GraphQL的目的是拥有一个包含其中每个实体的 GET_EVERYTHING 查询,但另一种选择听起来像是一个巨大的混乱 .

1 回答

  • 0

    每个类型/节点通常有一个删除突变 . 例如 . deleteUser,deleteBook,deleteMessage等 . 如果您希望能够一次删除多个条目,那么这些突变的输入通常是ID或ID列表 .

    如果您希望能够删除任何类型的具有单个突变的对象,您还可以拥有deleteNode突变 . 然后,您应该使所有可删除类型都从Node类型继承 - 并确保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
    }
    

    希望这可以帮助!

相关问题