如何在Strapi实体中比较两个字段实现查询?
在Strapi中实现关注数大于粉丝数的用户筛选
Strapi默认的URL查询参数(比如?filters[following][$gt]=100)只能和固定值比较,没法直接做字段间的对比,要实现你需要的逻辑,有两种常用方案:
方案1:自定义控制器+查询构建器
在用户实体的控制器里添加自定义接口,用Strapi内置的Knex查询构建器实现字段比较:
- 编辑
src/api/user/controllers/user.js,添加以下方法:
async findFollowingMoreThanFollowers(ctx) { // 使用Knex的whereRaw实现字段间的大于比较 const users = await strapi.db.query('api::user.user').findMany({ where: (builder) => { builder.whereRaw('following > followers'); }, }); ctx.body = users; }
- 配置路由,让这个接口可以访问,编辑
src/api/user/routes/user.js:
module.exports = { routes: [ // 保留原有路由的同时添加下面这条 { method: 'GET', path: '/users/following-more-than-followers', handler: 'user.findFollowingMoreThanFollowers', config: { policies: [], // 根据需求添加权限策略 }, }, ], };
之后你就可以通过GET /api/users/following-more-than-followers获取符合条件的用户。
方案2:直接调用实体服务(适合内部逻辑)
如果不需要对外暴露接口,只是在服务层或者自定义脚本里使用这个筛选逻辑,可以直接用Strapi的实体服务结合whereRaw:
// 在任意服务或脚本中调用 const targetUsers = await strapi.service('api::user.user').find({ where: strapi.db.whereRaw('following > followers'), });
额外注意
- 确认你的
user实体的following和followers字段是数字类型(比如整数或浮点数),否则比较逻辑会出错 - 数据库表名:Strapi默认会把实体名转成复数蛇形(比如
user实体对应users表),如果你的表名是自定义的,要在whereRaw里用正确的表字段名 - 权限:如果是公开接口,要在Strapi后台的「设置→权限」里给对应角色开放这个自定义接口的访问权限
内容的提问来源于stack exchange,提问作者MHZarei
相关产品推荐
相关产品推荐

