Strapi+GraphQL如何在单次查询中同时获取列表数据与总条数?
Strapi GraphQL 同请求返回 posts 列表与总条数实现方案
以下提供两种常用实现方式,可根据需求选择:
方案一:使用 Strapi 原生查询语法(无需修改代码)
Strapi v4 自带的 GraphQL 接口默认支持同时返回列表数据和分页元数据,不需要额外开发,直接使用如下查询即可:
query { posts { data { id attributes { title } } meta { pagination { total } } } }
返回结果中meta.pagination.total即为总条数,data字段对应所有post条目,分页筛选参数可以直接加在posts查询上,计数会自动对应筛选后的结果。
方案二:自定义查询实现你需要的返回结构
如果需要完全匹配你给出的返回格式,可以通过扩展GraphQL Schema实现:
- 在Strapi v4项目中打开
src/index.js文件,添加如下扩展配置:
module.exports = { register({ strapi }) { const graphqlExtension = strapi.plugin('graphql').service('extension'); graphqlExtension.use(({ nexus }) => ({ types: [ // 定义返回结构类型 nexus.objectType({ name: 'PostsWithCount', definition(t) { t.int('totalCount'); t.list.field('posts', { type: 'Post' }); }, }), // 扩展根查询 nexus.extendType({ type: 'Query', definition(t) { t.field('postsWithTotal', { type: 'PostsWithCount', // 可根据需要添加filters、sort、pagination等参数 async resolve(root, args) { // 同时查询列表和总数 const [posts, totalCount] = await Promise.all([ strapi.entityService.findMany('api::post.post', args), strapi.entityService.count('api::post.post', { filters: args.filters }) ]); return { totalCount, posts }; } }) } }) ] })); } }
- 重启Strapi服务后,使用如下查询即可得到目标结构:
query { postsWithTotal { totalCount posts { id title } } }
如果是Strapi v3版本,可在extensions/graphql/config/schema.graphql.js中按照相同逻辑自定义查询即可。
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

