Sequelize如何实现Category与Announcement两张表的联合搜索功能
问题原因
你当前的写法逻辑错误:把主表Announcement的过滤条件写在了关联表Category的where配置中,Sequelize会将这部分条件识别为对关联表的过滤规则,无法正确匹配主表的description字段。同时include加where默认会走内连接,会过滤掉所有没有关联分类的公告,哪怕描述命中关键词也不会返回。
正确实现代码
如果需要同时命中「分类名称含关键词」或者「公告描述含关键词」,且允许没有关联分类的公告也能被检索到(只要描述匹配),可以用下面的写法:
const announcementList = await Announcement.findAll({ where: { [Op.or]: [ // 匹配公告自身的描述字段 { description: { [Op.like]: `%${keyword}%` } }, // 用$关联模型名.字段$的语法引用关联表的字段做过滤 { '$Category.name$': { [Op.like]: `%${keyword}%` } } ] }, include: [ { model: Category, required: false // 配置为左连接,保留没有关联分类的公告数据 } ] })
如果你的业务只需要有关联分类的公告参与检索,把required: false改成required: true走内连接即可。如果要新增其他公告字段的搜索规则,直接在Op.or数组中追加对应字段的匹配条件即可。
内容的提问来源于stack exchange,提问作者Deepika Raturi
相关产品推荐
相关产品推荐

