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

