Каскадное удаление связанных узлов с использованием GraphQL и Prisma - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь выяснить каскадное удаление в 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?

В случае, если это важно, вот мутации, которые создают 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,
  )
}

Спасибо!

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете настроить каскадное удаление, изменив вашу модель данных.

Учитывая ваш вопрос, я предполагаю, что ваша модель данных выглядит примерно так:

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 можно прочитать в документации .

...