使用 GraphQL 和 Prisma 级联删除相关节点
Posted
技术标签:
【中文标题】使用 GraphQL 和 Prisma 级联删除相关节点【英文标题】:Cascade delete related nodes using GraphQL and Prisma 【发布时间】:2018-11-02 23:27:15 【问题描述】:我正在尝试找出 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】:您可以通过修改数据模型来设置级联删除。
鉴于您的问题,我假设您的数据模型看起来有点像这样:
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 in the documentation 中阅读有关级联删除的更多信息。
【讨论】:
以上是关于使用 GraphQL 和 Prisma 级联删除相关节点的主要内容,如果未能解决你的问题,请参考以下文章
如何在两个字段 prisma-graphql 中使用相同的生成 ID
使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询
使用 Prisma 和 Apollo 调用多个 GraphQL 突变的正确方法是啥