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

在Strapi中创建自定义API,获取评论最多的前5个Items

解决方案

一、直接在Strapi后端做自定义API是最优解

  • 减少前端HTTP请求次数,不用来回拼接处理数据,性能和体验更好
  • 逻辑集中在后端,后续改需求或维护更方便,无需改动前端代码
  • 避免前端承担复杂关联查询的逻辑,精简前端代码量

二、在Strapi中执行原生SQL的实现步骤

1. 确认路由配置

假设你已经在./src/api/[你的API名称]/routes/下创建了自定义路由文件(比如top-items.js),路由配置示例如下:

module.exports = {
  routes: [
    {
      method: 'GET',
      path: '/top-items',
      handler: 'top-items.getTopItems',
      config: {
        auth: false, // 根据实际需求设置是否需要认证
      },
    },
  ],
};

2. 编写控制器逻辑(执行原生SQL)

在./src/api/[你的API名称]/controllers/top-items.js中编写控制器代码,直接调用Strapi的数据库连接执行你写好的SQL:

module.exports = {
  async getTopItems(ctx) {
    try {
      // 替换成你自己写的SQL语句
      const sql = `
        SELECT i.*, COUNT(c.id) AS comment_count
        FROM items i
        INNER JOIN comments c ON i.id = c.object_id
        GROUP BY i.id
        ORDER BY comment_count DESC
        LIMIT 5;
      `;
      
      // 执行原生SQL,MySQL的查询结果默认在数组第一个元素中
      const result = await strapi.db.connection.raw(sql);
      
      // 返回处理后的数据给前端
      ctx.body = result[0];
    } catch (err) {
      ctx.status = 500;
      ctx.body = { error: err.message };
    }
  },
};

注意:如果你的表是Strapi自动生成的,表名可能带strapi_前缀(比如strapi_items、strapi_comments),要替换成数据库中实际的表名。

3. 测试接口

启动Strapi服务后,访问http://localhost:1337/top-items即可获取评论最多的前5条item数据。

三、替代方案:用Strapi查询构建器实现(无需原生SQL)

如果不想写原生SQL,也可以用Strapi自带的查询构建器实现,代码更贴合Strapi开发规范:

async getTopItems(ctx) {
  try {
    const topItems = await strapi.db.query('api::item.item').findMany({
      select: ['*'], // 选中item表的所有字段
      populate: {
        comments: {
          select: ['id'], // 仅获取评论id用于计数
        },
      },
      orderBy: {
        comments: {
          count: 'desc', // 按评论数量倒序排列
        },
      },
      limit: 5, // 限制返回前5条数据
    });
    
    // 手动为每条item添加评论数字段(按需返回)
    const result = topItems.map(item => ({
      ...item,
      comment_count: item.comments.length,
    }));
    
    ctx.body = result;
  } catch (err) {
    ctx.status = 500;
    ctx.body = { error: err.message };
  }
}

这种方式更符合Strapi的设计思路,但如果数据量较大,原生SQL的性能表现会更优。

内容的提问来源于stack exchange,提问作者Arrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:22:59