如何在Drizzle ORM的query.findMany中使用count()函数?
在Drizzle ORM中使用count()统计关联表数量(适配findMany场景)
直接在findMany的extras字段里用count(products.id)统计关联表数量是行不通的——findMany的with是用来做关联查询返回嵌套数组的,而聚合函数需要在SQL层面做分组统计,两者逻辑不兼容。
给你两个目前可行的解决方案:
方案一:手动构建聚合查询
用db.select()结合leftJoin和分组统计,直接在SQL层面完成计数:
const items = await useDb().select({ id: orders.id, status: orders.status, products_count: sql`count(${products.id})`.as('products_count'), }) .from(orders) .leftJoin(products, eq(orders.id, products.orderId)) .groupBy(orders.id, orders.status);
方案二:代码层面补统计
如果需要同时获取关联的products详细数据和数量,可以先通过findMany拿到完整关联数据,再在代码里计算长度:
const items = await useDb().query.orders.findMany({ columns: { id: true, status: true, }, with: { products: { columns: { id: true, }, }, }, }); // 给每个订单加上产品数量 const itemsWithCount = items.map(order => ({ ...order, products_count: order.products.length, }));
目前Drizzle ORM的findMany API还不支持在extras中直接使用关联表的聚合函数,这个需求在社区(包括Discord)确实被多次提及,但官方暂未推出原生支持的方案,上面两种是当前能实现需求的替代方式。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

