如何使用Sequelize同时查询多个模型的name字段实现统一搜索功能
实现方案
完全可以实现,你可以基于MySQL的UNION ALL语法搭配Sequelize的原生查询能力完成需求,既不需要并行执行多次查询,也不需要额外创建统一总表。
核心逻辑是把多个表的模糊匹配查询用UNION ALL拼接为单次查询语句,同时增加一个自定义的类型字段区分结果所属的模型,避免查出来的结果无法归类。
代码示例
首先请确认你的各个模型对应的数据表名(默认是模型名的小写复数形式,比如Car对应cars表,Bike对应bikes表),然后使用参数化查询避免SQL注入风险:
const { QueryTypes } = require('sequelize'); // 关键词拼接模糊匹配通配符 const searchKeyword = `%${用户输入的搜索内容}%`; const searchResults = await sequelize.query( ` SELECT id, name, 'car' AS resource_type FROM cars WHERE name LIKE :searchKeyword UNION ALL SELECT id, name, 'bike' AS resource_type FROM bikes WHERE name LIKE :searchKeyword UNION ALL SELECT id, name, 'electronic_part' AS resource_type FROM electronic_parts WHERE name LIKE :searchKeyword `, { replacements: { searchKeyword }, type: QueryTypes.SELECT } );
返回的结果里的resource_type字段会标识每条记录所属的模型,你可以根据这个字段做后续的业务逻辑处理。
可选优化:转换为模型实例
如果你需要使用对应模型的实例方法,可以把查询结果手动转为模型实例:
const formattedResults = searchResults.map(item => { switch(item.resource_type) { case 'car': return Car.build(item, { isNewRecord: false }); case 'bike': return Bike.build(item, { isNewRecord: false }); case 'electronic_part': return ElectronicPart.build(item, { isNewRecord: false }); default: return item; } })
扩展说明
- 如果需要返回更多字段,只要保证每个
UNION ALL子查询的返回字段数量、顺序、类型完全一致即可,比如你需要返回价格字段,就在每个子查询的SELECT语句里都加上price字段。 - 如果后续新增了其他带name字段的搜索对象,只要在SQL语句里追加一段对应的
UNION ALL子查询即可,改造成本很低。
内容的提问来源于stack exchange,提问作者nn3112337
相关产品推荐
相关产品推荐

