You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于枚举值查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:32:56