如何在Prisma中统计用户关联订单的支付记录总数?
解决方案
要实现查询用户时同时统计其关联的licenses、orders以及所有订单对应的payments总数,你可以通过以下两种方式修改Prisma查询:
方法一:查询后计算(简单直观)
先查询用户基础信息、licenses和orders的统计数,同时获取每个订单的支付记录数量,再通过代码求和得到总支付数:
const user = await prisma.users.findFirst({ where: { id: +userid, }, include: { _count: { select: { licenses: true, orders: true, }, }, // 仅获取每个订单的支付记录数量,不返回冗余字段 orders: { select: { _count: { select: { payments: true, }, }, }, }, }, }); // 计算所有订单的支付记录总数 const totalPayments = user.orders.reduce((total, order) => total + order._count.payments, 0); // 将总数合并到_count对象中 user._count.payments = totalPayments; // 可选:删除orders字段,避免返回多余数据 delete user.orders;
方法二:数据库层面子查询统计(减少代码处理)
通过Prisma的关联子查询直接在数据库中统计支付记录总数,无需后续代码求和:
const user = await prisma.users.findFirst({ where: { id: +userid, }, select: { // 保留需要的用户基础字段,根据实际需求调整 id: true, name: true, // 原有的统计字段 _count: { select: { licenses: true, orders: true, }, }, // 子查询统计该用户所有订单的支付记录总数 paymentsCount: { _aggregate: { count: true, }, where: { order: { userId: +userid, }, }, }, }, }); // 将子查询结果合并到_count中 user._count.payments = user.paymentsCount._aggregate.count; delete user.paymentsCount;
注意事项
确保你的Prisma Schema已正确定义关联关系:
model User { id Int @id @default(autoincrement()) licenses License[] orders Order[] // 其他用户字段 } model Order { id Int @id @default(autoincrement()) userId Int user User @relation(fields: [userId], references: [id]) payments Payment[] // 其他订单字段 } model Payment { id Int @id @default(autoincrement()) orderId Int order Order @relation(fields: [orderId], references: [id]) // 其他支付字段 }
内容的提问来源于stack exchange,提问作者SudoGaron
相关产品推荐
相关产品推荐

