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

Strapi多对多关联下查询同时匹配多个标签的实现方法咨询

多标签关联商品查询实现方案(Strapi + PostgreSQL 场景)

可以通过Strapi标准GraphQL、Bookshelf ORM直接实现该需求,无需强制使用原生查询,三种实现方式如下:

方案1:Strapi 标准 GraphQL 实现

Strapi v4 自带的GraphQL插件支持多条件嵌套过滤、排序、分页功能,直接使用如下查询语句即可:

query FilterGoodsWithMultipleLabels {
  goods(
    # 过滤条件:同时关联id为1和2的标签
    filters: {
      and: [
        { labels: { id: { eq: 1 } } },
        { labels: { id: { eq: 2 } } }
      ]
    }
    # 排序规则,可自定义字段和排序方向
    sort: { title: ASC }
    # 返回条数限制
    pagination: { limit: 10 }
  ) {
    data {
      id
      attributes {
        title
      }
    }
  }
}

方案2:Bookshelf ORM 实现

在Strapi服务端代码中可以直接通过ORM层实现查询,示例代码如下:

// 要匹配的标签id列表
const matchLabelIds = [1, 2];
const result = await strapi.query('api::good.good').findMany({
  where: {
    labels: {
      id: { $in: matchLabelIds }
    }
  },
  // 关联查询标签数据,不需要可以去掉
  populate: ['labels'],
  // 排序规则
  orderBy: { id: 'desc' },
  // 返回条数限制
  limit: 10,
  groupBy: 'id',
  // 要求匹配的标签数量等于传入的目标标签数量
  having: strapi.db.connection.raw('COUNT(DISTINCT labels.id) = ?', [matchLabelIds.length])
});

方案3:PostgreSQL 原生查询实现

如果有特殊场景需要使用原生SQL,可以直接执行如下查询语句,兼容排序和条数限制:

SELECT g.* 
FROM goods g
INNER JOIN goods_labels__labels_goods gl ON g.id = gl.good_id
WHERE gl.label_id IN (1,2)
GROUP BY g.id
-- 确保同时命中所有目标标签
HAVING COUNT(DISTINCT gl.label_id) = 2
-- 排序规则,可自定义
ORDER BY g.title ASC
-- 返回条数限制
LIMIT 10;

在Strapi中调用原生查询的代码示例:

const goods = await strapi.db.connection.raw(`
  SELECT g.* 
  FROM goods g
  INNER JOIN goods_labels__labels_goods gl ON g.id = gl.good_id
  WHERE gl.label_id IN (1,2)
  GROUP BY g.id
  HAVING COUNT(DISTINCT gl.label_id) = 2
  ORDER BY g.title ASC
  LIMIT 10;
`);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:57:04