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

Sam*_*lon 2 cascading-deletes graphql prisma

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

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

用于删除的突变Question

type Mutation {
  deleteQuestion(where: QuestionWhereUniqueInput!): Question!
}
Run Code Online (Sandbox Code Playgroud)

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

function deleteQuestion(parent, args, context, info) {
  const userId = getUserId(context)  
  return context.db.mutation.deleteQuestion(
      {
        where: {id: args.id}
      },
      info,
  )
}
Run Code Online (Sandbox Code Playgroud)

如何修改该突变以删除相关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,
  )
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

mar*_*ani 6

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

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

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

type QuestionVote {
  id: ID! @unique
  question: Question @relation(name: "QuestionVotes")
  isUpvote: Boolean!
}
Run Code Online (Sandbox Code Playgroud)

然后,您必须将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!
}
Run Code Online (Sandbox Code Playgroud)

现在,每次Question删除节点时,所有相关QuestionVote节点也将删除。

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

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