Prisma中按订单流程类型统计订单并关联流程名称的问题
Prisma按订单流程类型统计订单并关联流程名称的解决方案
你的核心问题是groupBy查询无法直接关联OrderProcessType表的processName字段,因为Prisma的groupBy仅支持分组字段和聚合函数,不能直接包含关联表的非分组字段。以下是两种可行的解决方法:
方法一:从OrderProcessType模型反向查询并统计
利用模型间的关联关系,从OrderProcessType出发查询,同时统计关联的订单数量,再调整结果结构匹配期望格式:
// 查询流程类型及对应订单数量 const processData = await prisma.orderProcessType.findMany({ select: { orderProcessTypeId: true, processName: true, _count: { select: { orders: true // 统计关联的订单数量 } } } }); // 转换为期望的结果结构 const result = processData.map(item => ({ _count: { _all: item._count.orders }, orderProcessTypeId: item.orderProcessTypeId, processName: item.processName }));
这种方法完全基于Prisma ORM,类型安全,无需写原生SQL,适合大多数常规场景。
方法二:使用原生SQL直接关联查询
如果需要更灵活的查询逻辑,可以用Prisma的$queryRaw执行原生SQL,直接关联两张表并分组统计:
// 执行原生SQL查询 const rawData = await prisma.$queryRaw` SELECT opt.orderProcessTypeId, opt.processName, COUNT(o.orderId) as order_count FROM OrderProcessType opt LEFT JOIN \`Order\` o ON opt.orderProcessTypeId = o.orderProcessTypeId GROUP BY opt.orderProcessTypeId, opt.processName `; // 转换为期望的结果结构 const result = rawData.map(item => ({ _count: { _all: item.order_count }, orderProcessTypeId: item.orderProcessTypeId, processName: item.processName }));
注意:SQL中Order需要用反引号包裹,因为它是SQL关键字。
两种方法最终都能输出你期望的包含_count、orderProcessTypeId和processName的结果结构。
内容的提问来源于stack exchange,提问作者Irfan Arif
相关产品推荐
相关产品推荐

