使用Nexus解析GraphQL关联关系遇到问题求助
问题分析与解决方法
你的关联解析失败主要有两个核心问题:查询条件错误和resolve逻辑未正确关联数据,同时需要确保Prisma模型的关联关系定义正确。以下是具体修正方案:
1. 先确认Prisma模型的关联定义
首先确保你的schema.prisma中正确定义了User与Post的双向关联,否则数据库层面没有外键约束,查询必然失败:
model User { id Int @id @default(autoincrement()) name String? email String @unique posts Post[] // 关联用户的所有帖子 } model Post { id Int @id @default(autoincrement()) title String? body String? published Boolean @default(false) userId Int // 外键,关联User的id user User @relation(fields: [userId], references: [id]) // 关联到用户 }
修改后记得运行npx prisma migrate dev同步数据库结构。
2. 修正User类型的posts字段解析
原问题:
getPosts函数中错误使用where: {id: id},这是用Post自己的id筛选,不是关联用户的userId- resolve函数中
await后嵌套then且未正确返回结果
修正后的代码:
export const User = objectType({ name: 'User', definition(t) { t.int('id') t.string('name') t.string('email') t.list.field('posts', { type: 'Post', // 直接在resolve中查询,避免多余封装 resolve: async (user, _args, ctx) => { return ctx.db.post.findMany({ where: { userId: user.id } // 使用userId筛选该用户的帖子 }) } }) } })
如果保留getPosts函数,需修正查询条件:
export function getPosts(userId: number | null) { if (userId) { return db.post.findMany({ where: { userId } }) // 改为筛选userId } return null }
3. 修正Post类型的user字段解析
原问题:
resolve直接返回Post对象本身,但Post对象中只有userId,需要通过userId查询对应的User
修正后的代码:
export const Post = objectType({ name: 'Post', definition(t) { t.int('id') t.string('title') t.string('body') t.boolean('published') t.field('user', { type: 'User', resolve: async (post, _args, ctx) => { // 通过Post的userId查询关联用户 return ctx.db.user.findUnique({ where: { id: post.userId } }) } }) } })
4. 优化建议
- 可以使用Nexus的
prismaObjectType(需安装nexus-prisma依赖)自动生成关联字段的resolve逻辑,减少手写代码量 - 复杂查询建议使用Prisma的
include或select提前预加载关联数据,避免N+1查询问题
内容的提问来源于stack exchange,提问作者bluedot
相关产品推荐
相关产品推荐

