在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
相关产品推荐
相关产品推荐

