本文讲解如何在 prisma 中正确筛选出“至少拥有一个菜单”的子分类(subcategory),避免误用 `where: { id: { not: null }

在 Prisma 中,当你希望基于一对多关系(如 SubCategory 与 Menu)进行条件过滤——例如“只获取那些已配置至少一个菜单的子分类”——不能对关系字段(如 menu)使用 where: { id: { not: null } }。原因在于:
✅ 正确做法是使用 关系过滤操作符 some:
它用于判断一对多关系中是否存在满足条件的关联记录。若传入空对象 {},即表示“只要存在至少一条关联记录即可”,完美契合“菜单非空”的业务需求。
以下是推荐的完整查询代码:
const topCategories = await this.prisma.subCategory.findMany({
where: {
menu: {
some: {}, // ✅ 关键:筛选出 menu 数组长度 ≥ 1 的 SubCategory
},
},
include: {
menu: true, // ✅ 同时加载关联的菜单数据(可选,按需保留)
},
orderBy: {
id: 'desc',
},
take: 50,
});? 注意事项与最佳实践:
menu: {
some: {
status: 'ACTIVE', // 假设 Menu 模型中有 status 字段
}
}总结:Prisma 的关系过滤依赖语义化操作符(some / every / none),而非标量空值判断。掌握 some: {} 是实现“关联数据非空”筛选的简洁、高效且符合 Prisma 设计哲学的标准方案。