You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:27:06