使用 GraphQL 和 Prisma 级联删除相关节点

Posted

技术标签:

【中文标题】使用 GraphQL 和 Prisma 级联删除相关节点【英文标题】:Cascade delete related nodes using GraphQL and Prisma 【发布时间】:2018-11-02 23:27:15 【问题描述】:

我正在尝试找出 GraphQL 中的级联删除。

我正在尝试删除Question 类型的节点,但QuestionVote 类型与Question 具有必需的关系。我正在寻找一种方法来一次删除 Question 及其所有投票。

删除Question的突变:

type Mutation 
  deleteQuestion(where: QuestionWhereUniqueInput!): Question!

及其解析器(我正在使用 Prisma):

function deleteQuestion(parent, args, context, info) 
  const userId = getUserId(context)  
  return context.db.mutation.deleteQuestion(
      
        where: id: args.id
      ,
      info,
  )

如何修改该突变以同时删除相关的QuestionVote 节点?或者我应该添加一个单独的突变来删除QuestionVote 的一个或多个实例?

如果它很重要,这里是创建 QuestionQuestionVote 的突变:

function createQuestion(parent, args, context, info) 
    const userId = getUserId(context)
    return context.db.mutation.createQuestion(
        
            data: 
              content: args.content,
              postedBy:  connect:  id: userId  ,
            ,
        ,
        info,
    )


async function voteOnQuestion(parent, args, context, info) 
  const userId = getUserId(context)

  const questionExists = await context.db.exists.QuestionVote(
    user:  id: userId ,
    question:  id: args.questionId ,
  )
  if (questionExists) 
    throw new Error(`Already voted for question: $args.questionId`)
  

  return context.db.mutation.createQuestionVote(
    
      data: 
        user:  connect:  id: userId  ,
        question:  connect:  id: args.questionId  ,
      ,
    ,
    info,
  )

谢谢!

【问题讨论】:

【参考方案1】:

您可以通过修改数据模型来设置级联删除。

鉴于您的问题,我假设您的数据模型看起来有点像这样:

type Question 
  id: ID! @unique
  votes: [QuestionVote!]! @relation(name: "QuestionVotes")
  text: String!


type QuestionVote 
  id: ID! @unique
  question: Question @relation(name: "QuestionVotes")
  isUpvote: Boolean!

然后你必须像这样将onCascade: DELETE 字段添加到@relation 指令中:

type Question 
  id: ID! @unique
  votes: [QuestionVote!]! @relation(name: "QuestionVotes" onDelete: CASCADE)
  text: String!


type QuestionVote 
  id: ID! @unique
  question: Question @relation(name: "QuestionVotes")
  isUpvote: Boolean!

现在,每删除一个Question 节点,所有相关的QuestionVote 节点也会被删除。

注意:如果省略onDelete,则默认值自动设置为onDelete: SET_NULL。这意味着删除节点会导致将关系的另一端设置为null

您可以在 Prisma in the documentation 中阅读有关级联删除的更多信息。

【讨论】:

以上是关于使用 GraphQL 和 Prisma 级联删除相关节点的主要内容,如果未能解决你的问题,请参考以下文章

如何在两个字段 prisma-graphql 中使用相同的生成 ID

使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询

使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥

模式拼接两个远程 Prisma/GraphQL 模式

使用 Apollo + GraphQL 将 Prisma 1 升级到 Prisma 2

使用 Prisma + MongoDB + GraphQL 的嵌套关系返回 null