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

使用GraphQL和Prisma级联删除相关节点,graphql,cascading-deletes,prisma,Graphql,Cascading Deletes,Prisma,我试图找出GraphQL中的级联删除 我正在尝试删除类型为Question的节点,但类型QuestionVote与Question具有必需的关系。我正在寻找一种方法,一次删除一个问题及其所有投票 删除问题的变异: type Mutation { deleteQuestion(where: QuestionWhereUniqueInput!): Question! } 以及它的解析器(我使用的是Prisma): 如何修改该变异以同时删除相关的QuestionVote节点?或者我应该添加一个单

我试图找出GraphQL中的级联删除

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

删除
问题的变异

type Mutation {
  deleteQuestion(where: QuestionWhereUniqueInput!): Question!
}
以及它的解析器(我使用的是Prisma):

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

如果这很重要,以下是产生
Question
QuestionVote
的突变:

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,
  )
}

谢谢

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

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

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!
}
现在,每次删除
问题
节点时,所有相关的
问题投票
节点也会被删除

注意:如果省略
onDelete
,默认情况下该值会自动设置为
onDelete:set\u NULL
。这意味着删除节点会导致将关系的另一端设置为
null

您可以阅读有关Prisma中级联删除的更多信息

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!
}