如何通过GraphQL获取Strapi一对多关联的子项数量?(含分页场景)
嘿,我来帮你搞定Strapi里用GraphQL获取关联子项数量和分页的问题!
解决Strapi一对多关联的GraphQL子项计数与分页需求
一、获取关联子项的数量
针对Strapi的一对多关联(比如Shop和Product),有两种常用方式获取子项数量:
1. 使用内置的Connection查询(推荐,适配分页场景)
Strapi的GraphQL API默认给关联字段提供了[关联名]Connection的查询入口,它不仅能返回关联数据,还包含聚合统计信息(比如总数)。直接用这个就能快速拿到子项数量:
query { shops(id: 1) { id name productsConnection { aggregate { count # 这里就是当前shop下products的总数量 } } } }
2. 自定义模型虚拟字段(适合列表批量返回数量)
如果希望每次查询Shop时,直接在结果里拿到products数量(不需要嵌套查询),可以给Shop模型添加一个虚拟字段,通过生命周期钩子自动计算数量:
- 打开
src/api/shop/models/shop.js,添加虚拟字段和生命周期钩子:
module.exports = { attributes: { id: { type: 'number', required: true }, name: { type: 'string', required: true }, // 定义虚拟字段,不存入数据库 productsCount: { type: 'number', columnType: 'integer', virtual: true, }, // 关联字段保持不变 products: { collection: 'product', via: 'shop', }, }, // 添加生命周期钩子,在查询后自动计算数量 lifecycles: { async afterFindOne(result) { if (result) { result.productsCount = await strapi.query('product').count({ where: { shop: result.id } }); } }, async afterFind(results) { for (const shop of results) { shop.productsCount = await strapi.query('product').count({ where: { shop: shop.id } }); } }, }, };
- 重启Strapi后,就可以直接在GraphQL查询里获取数量了:
query { shops(id: 1) { id name productsCount } }
二、改造查询满足分页需求
你的原查询只获取了products的id,但分页需要总数量(计算总页数)和当前页数据,用productsConnection结合分页参数就能实现:
偏移量分页(适合简单场景)
用first(每页条数)和skip(跳过的条数)来控制分页,同时拿到总数量:
query { shops(id: 1) { id name productsConnection(first: 10, skip: 0) { aggregate { count # 总数量,用来计算总页数 } edges { node { id # 这里可以添加你需要的其他products字段 } } } } }
skip: 0表示第1页,skip: 10表示第2页,以此类推。
游标分页(Strapi推荐,适合大数据量)
如果数据量较大,游标分页性能更好,用after(上一页最后一条数据的cursor)来定位:
query { shops(id: 1) { id name productsConnection(first: 10, after: "上次返回的endCursor") { aggregate { count } edges { cursor # 每条数据的游标,用于下一页的after参数 node { id } } pageInfo { hasNextPage # 是否还有下一页 endCursor # 当前页最后一条数据的游标 } } } }
内容的提问来源于stack exchange,提问作者fullmoon6661
相关产品推荐
相关产品推荐

