Node.js+Sequelize关联表查询:如何按collection_name搜索书籍?
解决多对多关联下的跨表搜索问题
要实现同时按书籍名称、作者和所属收藏集名称搜索书籍,你需要在查询的where条件中加入对关联表Collection字段的匹配,利用Sequelize的关联字段引用语法即可实现:
修改后的完整代码
// 确保已导入Op const { Op } = require('sequelize'); router.get("/search", (req, res) => { const { term } = req.query; console.log(term) Book.findAll({ include: [ { model: Collection, required: false // 保持左连接,无关联收藏集的书籍也能被name/author搜索到 }, ], where: { [Op.or]:[ {name: { [Op.like]: `%${term}%` }}, {author: { [Op.like]: `%${term}%` }}, // 引用关联表的collection_name字段进行匹配 {'$Collection.collection_name$': { [Op.like]: `%${term}%` }} ] } }).then((book) => { res.status(200).json(book); }) .catch((err) => res.status(404).json({ error: err })); });
关键改动说明
- 使用
$Collection.collection_name$语法引用关联表的字段,Sequelize会自动解析为关联表的对应字段,实现跨表条件匹配 - 添加
required: false到include配置中,确保即使书籍未关联任何收藏集,也能通过名称或作者的条件被检索到;如果只需要返回存在匹配收藏集的书籍,可将该值改为true(内连接) - 改用模板字符串
%${term}%替代字符串拼接,代码更简洁易读
内容的提问来源于stack exchange,提问作者Shabnam Sabah
相关产品推荐
相关产品推荐

