如何基于枚举值查询Prisma 1.17.1中的User对象数组?
解决Prisma 1.17.1中按枚举Role查询用户数组的问题
咱们先拆解下你遇到的核心问题:一是当前findUser设计返回单个用户,但你需要的是匹配条件的用户数组;二是直接用role: "TEACHER"过滤会报错,因为Prisma 1中对数组类型的枚举字段需要用特定的过滤操作符,而且user查询对应的UserWhereUniqueInput只支持带@id/@unique的字段,不包含role。
下面分步骤给出修改方案:
1. 调整Schema中的findUser定义
首先把返回类型从单个User改成数组[User]!,同时保留可选参数(方便你单独按role查询,或结合id/email组合查询):
type Query { users: [User]! user(where: UserWhereInput!): User findUser(role: Role, id: ID, email: String): [User]! # 修改返回类型为数组 }
2. 修改解析器的findUser逻辑
需要动态构建查询条件,并且针对role数组使用Prisma 1支持的contains操作符(因为你的role是@scalarList(strategy: RELATION)定义的数组)。另外,要改用users查询(返回数组),而不是user查询(返回单个用户):
async findUser(parent, args, ctx, info) { const where = {}; // 处理email过滤条件 if (args.email) { where.email = args.email; } // 处理id过滤条件 if (args.id) { where.id = args.id; } // 处理role过滤:数组枚举用contains操作符 if (args.role) { where.role_contains = args.role; } // 用users查询返回匹配的用户数组 return ctx.db.query.users({ where }, info); }
3. 验证查询语法
现在你可以这样查询所有角色为TEACHER的用户:
query { findUser(role: TEACHER) { id fname lname email role } }
额外说明
- 如果需要精确匹配用户的角色仅包含TEACHER(而不是包含TEACHER即可),可以把role的过滤条件改成:
where.role = { equals: ["TEACHER"] } - 之前报错的原因:
ctx.db.query.user()需要的UserWhereUniqueInput仅支持id、email这类唯一标识字段,role不在其中;而ctx.db.query.users()用的UserWhereInput支持数组字段的过滤操作符,比如role_contains、role_hasAll等。
内容的提问来源于stack exchange,提问作者jwknz
相关产品推荐
相关产品推荐

