graphql - 使用 GraphQL 和 Prisma 级联删除相关节点
问题描述
我试图找出 GraphQL 中的级联删除。
我正在尝试删除 type 的节点Question
,但 typeQuestionVote
与Question
. 我正在寻找一种方法来Question
一次删除 a 及其所有投票。
用于删除 a 的突变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
节点也会被删除。
注意:如果省略
onDelete
,默认情况下会自动设置为onDelete: SET_NULL
。这意味着删除一个节点会导致将关系的另一侧设置为null
。
您可以在文档中阅读有关 Prisma 中级联删除的更多信息。
推荐阅读
- excel - 从 XLS 文件运行宏读取工作表名称
- azure - 有没有办法为微软监控代理指定目标日志文件来监听并从代码中提取日志?
- symfony - symfony 4 中实体的动态访问控制
- visual-studio - .net core 2.2.0 vs 2.2.7 无法合并,因为版本被项目锁定
- java - 如何通过自定义拨号器在自定义呼叫者应用程序中呼叫期间发送号码(到计算机进行操作)
- java - 自动化/处理第 5 个下拉 url https://jedwatson.github.io/react-select/ 命名为 Github 用户(带有 fetch.js 的 Aysnc)
- grails - 在 grails 3 拦截器中的每个请求上添加响应标头
- javascript - Angular 7向表单添加新字段
- internet-explorer - Kendo UI Gantt - Jquery - 显示 URL 太长时出错
- python - 在python中从一个系列中创建两个数组