作者:星空下看太阳- | 来源:互联网 | 2022-12-16 12:42
我试图找出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> marktani..:
您可以通过修改数据模型来设置级联删除。
鉴于您的问题,我假设您的数据模型看起来像这样:
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 中阅读有关级联删除的更多信息。