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

如何在Strapi实体中比较两个字段实现查询?

在Strapi中实现关注数大于粉丝数的用户筛选

Strapi默认的URL查询参数(比如?filters[following][$gt]=100)只能和固定值比较,没法直接做字段间的对比,要实现你需要的逻辑,有两种常用方案:

方案1:自定义控制器+查询构建器

在用户实体的控制器里添加自定义接口,用Strapi内置的Knex查询构建器实现字段比较:

  1. 编辑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;
}
  1. 配置路由,让这个接口可以访问,编辑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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:45:59