
本文详解如何使用 prisma 的 `some` 关系过滤器,精准查询拥有至少一条关联记录的父模型(如 subcategory),避免误用 `not: null` 导致的语法错误。
在 Prisma 中,当你希望「只获取那些关联了至少一条子记录的父记录」时(例如:仅返回存在菜单的子分类),不能对关系字段(如 menu: Menu[])使用 where: { id: { not: null } }——这不仅逻辑错误(数组本身不可能为 null,只会为空数组 []),更会触发 Prisma 客户端报错:"Argument 'not' must not be null.",因为 not: null 是非法语法。
正确做法是使用 Prisma 提供的关系过滤操作符 some。它专为“存在性检查”设计:menu: { some: {} } 表示「该 SubCategory 至少关联了一条 Menu 记录」,无需指定具体条件,空对象 {} 即表示“任意匹配”。
✅ 正确示例代码如下:
const topCategories = await this.prisma.subCategory.findMany({
where: {
menu: {
some: {}, // ✅ 关键:筛选出 menu 数组非空(长度 ≥ 1)的 SubCategory
},
},
include: {
menu: true, // ✅ 同时加载关联的 menu 数据(可选,按需保留)
},
orderBy: {
id: 'desc',
},
take: 50,
});⚠️ 注意事项:
- some: {} 与 some: { id: { gt: 0 } } 等价(因 id 为主键且非空),但前者更简洁、语义更清晰;
- 若需进一步筛选关联数据(如只包含已启用的菜单),可在 some 内添加条件:some: { isActive: true };
- 不要混淆 include 和 where:include 控制响应中是否携带关联数据,where(含 some)控制查询结果的主模型范围;
- every(全部满足)、none(完全不满足)也是常用关系过滤符,适用于不同业务场景。
总结:Prisma 的关系过滤必须通过 some/every/none 显式表达存在性逻辑,而非尝试对数组字段做 null 判断。掌握 some: {} 是实现“非空关联查询”的标准且高效方式。










