使用 GraphQL 和 Prisma 级联删除相关节点
Cascade delete related nodes using GraphQL and Prisma
我正在尝试找出 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,
)
}
谢谢!
您可以通过修改数据模型来设置级联删除。
鉴于你的问题,我假设你的数据模型看起来有点像这样:
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
节点也会被删除。
Note: If omitting onDelete
, the value is automatically set to onDelete: SET_NULL
by default. This means that deleting a node results in setting the other side of the relation to null
.
您可以在 Prisma 中阅读有关级联删除的更多信息 in the documentation。
我正在尝试找出 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,
)
}
谢谢!
您可以通过修改数据模型来设置级联删除。
鉴于你的问题,我假设你的数据模型看起来有点像这样:
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
节点也会被删除。
Note: If omitting
onDelete
, the value is automatically set toonDelete: SET_NULL
by default. This means that deleting a node results in setting the other side of the relation tonull
.
您可以在 Prisma 中阅读有关级联删除的更多信息 in the documentation。