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

Strapi v4 REST API如何使用$and过滤器实现多条件查询

Strapi v4 多关系匹配的$and过滤器实现方法

首先确认内容类型基础配置符合要求:

  • 已创建Student(学生)内容类型,配置名为courses的关系字段,关联Course(课程)内容类型,关系类型为多对多(一个学生可关联多门课程)
  • Course内容类型存在字符串类型的name字段存储课程名称

常见错误写法(会导致筛选失效)

  1. 同层级重复写同字段条件,参数会被覆盖,最终仅生效最后一个条件:
// 错误效果:最终只会筛选选了Physics的学生,Maths的筛选条件会被覆盖
GET /api/students?filters[courses][name][$eq]=Maths&filters[courses][name][$eq]=Physics
  1. 将$and写在关系字段内部,逻辑变成匹配「同时满足两个条件的单条课程记录」,不存在符合要求的课程会返回空结果:
// 错误逻辑:匹配名称同时为Maths和Physics的单门课程,无符合条件数据
GET /api/students?filters[courses][$and][0][name][$eq]=Maths&filters[courses][$and][1][name][$eq]=Physics

正确实现方式

1. 直接拼接REST API请求URL

将两个关系匹配条件作为独立项放在$and数组下,最终请求格式:

GET /api/students?filters[$and][0][courses][name][$eq]=Maths&filters[$and][1][courses][name][$eq]=Physics

如果需要同时返回学生关联的课程信息,追加populate参数即可:

GET /api/students?filters[$and][0][courses][name][$eq]=Maths&filters[$and][1][courses][name][$eq]=Physics&populate[courses]=*

如果是通过课程ID筛选(更稳定,避免重名问题),把name字段替换为id,值替换为对应课程的数字ID即可,例:

GET /api/students?filters[$and][0][courses][id][$eq]=1&filters[$and][1][courses][id][$eq]=2

2. 前端用qs库构造查询参数

前端项目调用接口时,推荐用qs库序列化查询参数,避免手写URL拼接出错,对应配置:

import qs from 'qs';

const query = qs.stringify({
  filters: {
    $and: [
      { courses: { name: { $eq: 'Maths' } } },
      { courses: { name: { $eq: 'Physics' } } }
    ]
  },
  populate: { courses: true }
}, { encodeValuesOnly: true });

// 发起请求
fetch(`/api/students?${query}`)

3. 服务端实体服务查询写法

在Strapi项目的自定义接口、路由钩子中做服务端查询时,对应写法:

const matchedStudents = await strapi.entityService.findMany('api::student.student', {
  filters: {
    $and: [
      { courses: { name: { $eq: 'Maths' } } },
      { courses: { name: { $eq: 'Physics' } } }
    ]
  },
  populate: { courses: true }
});

注意事项

  • $and下的每个条件项是独立查询分支,Strapi会取所有分支查询结果的交集,即同时满足所有选课条件的学生列表
  • 不要在同一个条件对象里重复声明同名key,会被JS语法直接覆盖,导致条件丢失
  • 筛选同时选修3门及以上课程的场景,只需在$and数组中继续追加对应课程的匹配项即可

内容的提问来源于stack exchange,提问作者Ibor Stan Onen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:27:13