Sequelize多表关联如何通过findAll实现产品名或标签名模糊匹配查询
实现方案
你需要把产品名匹配和关联标签名匹配的条件放到主查询的Op.or逻辑中,同时配合关联查询的参数调整即可实现需求,示例代码如下:
首先确保你已经引入Sequelize的操作符:
const { Op } = require('sequelize');
查询逻辑:
// 替换为实际传入的搜索关键词 const searchKey = '你的搜索关键词'; const result = await db.products.findAll({ where: { [Op.or]: [ // 条件1:产品名模糊匹配 { product_name: { [Op.like]: `%${searchKey}%` } }, // 条件2:关联标签名模糊匹配,用$关联别名.字段$引用关联表字段 { '$tags.tag_name$': { [Op.like]: `%${searchKey}%` } } ] }, include: [ { model: db.tag_names, as: 'tags', required: false // 不强制要求产品存在关联标签,避免产品名匹配但无标签的产品被过滤 } ], distinct: true // 去重,避免单产品多匹配标签时返回重复记录 });
关键说明
$tags.tag_name$是Sequelize提供的跨表字段引用语法,tags就是你定义关联时设置的as别名- 如果使用PostgreSQL数据库需要大小写不敏感匹配,可将
Op.like替换为Op.iLike - 如果不需要返回关联的标签信息,可以在include中加
attributes: []不返回标签字段
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

