如何在Prisma中删除含或不含子记录的IssueGroup?
解决方案:删除IssueGroup时同步删除关联Issue(GraphQL+Apollo+Prisma)
1. 修改Prisma Schema实现级联删除
由于你的Issue表中issueGroupId是必填字段(非nullable),SetNull会违反字段约束导致VS Code警告,正确做法是使用onDelete: Cascade,删除IssueGroup时会自动删除所有关联的Issue。
更新后的Prisma Schema示例:
model IssueGroup { id Int @id @default(autoincrement()) name String issues Issue[] // 一对多关联:一个IssueGroup对应多个Issue } model Issue { id Int @id @default(autoincrement()) title String issueGroupId Int // 必填关联字段,不可为null issueGroup IssueGroup @relation( fields: [issueGroupId], references: [id], onDelete: Cascade // 核心配置:级联删除关联Issue ) }
修改完成后执行数据库迁移:
npx prisma migrate dev
2. 修复「要删除的记录不存在」错误
该错误通常因传入的IssueGroup ID无效(不存在或格式错误)导致,可在Apollo resolver中捕获Prisma特定错误码,返回清晰提示:
// Apollo Server resolver 示例 const deleteIssueGroup = async (_, { id }, { prisma }) => { try { // 执行删除操作,可选include关联Issue用于返回结果 const deletedGroup = await prisma.issueGroup.delete({ where: { id: parseInt(id) }, include: { issues: true } }); return deletedGroup; } catch (error) { // Prisma的P2025错误码对应「记录不存在」 if (error.code === 'P2025') { throw new Error('要删除的IssueGroup不存在'); } // 抛出其他未知错误 throw error; } };
3. 验证操作
- 测试删除包含Issue的IssueGroup,检查数据库中关联Issue是否被同步删除
- 测试传入无效ID,确认返回的错误提示准确
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

