Prisma关联查询问题:筛选同时包含指定子分类的商品
解决Prisma查询同时包含多个子分类的商品问题
针对你的需求——查询同时包含所有指定子分类ID的商品(允许关联更多子分类),直接用some或every确实达不到效果,这里给你两种可行的实现方式:
方法一:多条件AND组合(最直观)
利用Prisma查询的AND逻辑,对每个目标子分类ID单独做some判断,确保商品同时满足所有子条件:
const targetSubCategoryIds = [2, 3]; // 传入的目标子分类ID数组 const matchedProducts = await prisma.product.findMany({ where: { AND: targetSubCategoryIds.map(id => ({ subCategories: { some: { id } } })) }, include: { subCategories: true // 可选,返回商品关联的所有子分类 } });
原理
每个subCategories.some({ id: X })会检查商品是否包含ID为X的子分类,多个条件通过AND组合后,只有同时满足所有条件的商品才会被返回,完美匹配“至少包含所有指定子分类”的需求。
方法二:聚合计数匹配
通过统计商品匹配目标子分类的数量,判断是否等于目标ID的总数:
const targetSubCategoryIds = [2, 3]; const matchedProducts = await prisma.product.findMany({ where: { // 先筛选出包含至少一个目标子分类的商品 subCategories: { some: { id: { in: targetSubCategoryIds } } }, // 统计商品匹配的目标子分类数量,必须等于目标ID的总数 _count: { subCategories: { where: { id: { in: targetSubCategoryIds } } } }: { equals: targetSubCategoryIds.length } }, include: { subCategories: true } });
原理
先缩小范围到包含至少一个目标子分类的商品,再通过_count统计该商品关联的目标子分类数量,当数量和目标ID数组长度一致时,说明商品包含了所有指定的子分类。
为什么单独用some/every不行?
some:只要商品包含任意一个目标子分类就返回,会混入只含单个子分类的商品,不符合要求;every:要求商品的所有子分类都属于目标列表,也就是商品不能关联其他子分类,和需求矛盾。
内容的提问来源于stack exchange,提问作者user21172353
相关产品推荐
相关产品推荐

