Prisma升级至2.19.0后eventParticipant.findMany关联过滤报错
根因分析
这两个报错本质都是Prisma 2.12到2.19版本迭代过程中,对可空关系字段的过滤规则做了破坏性调整,加上生成的Client缓存不同步共同导致的:
- 你Schema里的
EventParticipant.event是可空关联(定义为event Event?),从2.12版本开始,Prisma不再支持直接给可空关系字段传关联模型的WhereInput作为过滤条件。运行时会优先把这类字段的入参识别为EventRelationFilter结构,所以你最初直接传带AND的eventFilter时,运行时找不到匹配的合法字段,抛出Unknown arg AND的错误。 - 你用
is包裹过滤条件后报错的原因,是升级版本时没有清理旧的生成缓存:你虽然把npm包升到了2.19.0,但node_modules/.prisma/client下的旧生成文件没有被替换,运行时的校验逻辑还是旧版本的,不会识别is是合法的关系过滤字段,反而把入参当成普通的EventWhereInput来校验,最终抛出Unknown arg is的错误。 - 你Schema里的额外偏差:User模型下单独定义的
event Event[]关联没有对应的反向映射字段,本身就属于不完整的关系定义,Prisma在生成Client时会对这类定义做容错处理,但很容易出现关系解析的优先级混乱,进一步放大入参匹配的异常。
修复方案
按顺序执行以下步骤即可解决:
- 调整查询代码结构,适配可空关系的过滤规则
把原来直接传给event字段的关联过滤条件,通过is字段包裹,符合2.19版本对可空关联的入参要求:import { Prisma } from '@prisma/client' const eventFilter: Prisma.EventWhereInput = { AND: [ { startTime: { lte: moment().toISOString() } }, { endTime: { gte: moment().toISOString() } }, { place: { id: placeId || { not: null } } } ] } await prisma.eventParticipant.findMany({ where: { user: { id: XXX }, event: { is: eventFilter } } }) - 清理旧的Prisma生成缓存,重新生成Client
- 删除
node_modules/.prisma/client目录下的所有旧生成文件 - 执行
npx prisma generate,生成和2.19.0版本完全匹配的Client代码,确保运行时校验逻辑和类型定义对齐
- 删除
- 修正Schema中的不完整关联定义
你在User模型下定义的event Event[]没有对应的反向关联字段,既可以给Event模型补充对应的反向字段,也可以直接删除这个多余的关联,避免Prisma在解析关系时产生歧义。
可选优化
如果你的业务逻辑中EventParticipant的event关联永远不为空,可以直接把Schema里的event Event?改成event Event(去掉可空标记),这种非可空的关联字段就可以直接传关联模型的WhereInput作为过滤入参,不需要额外用is包裹,代码写起来更简洁。
内容的提问来源于stack exchange,提问作者Luis Danilo
相关产品推荐
相关产品推荐

