Sequelize中如何实现跨books、authors两张表的关联条件搜索
问题原因
顶层where配置默认只作用于主表(这里是Book表),直接写入关联表字段无法被Sequelize正确识别,所以会报字段不存在的错误。
解决方案
方法1:使用$关联模型名.字段$语法(推荐)
Sequelize支持用$包裹关联模型+字段的形式直接引用关联表字段,无需额外配置别名,只要你已经在include中引入了对应关联模型即可,修改后代码如下:
const { Op } = require('sequelize'); // 确保已引入Op search: (req, res) => { const { query } = req.query; Book.findAll({ include: [Author], where: { [Op.or]: [ { title: { [Op.substring]: query } }, { '$Author.first_name$': { [Op.substring]: query } }, { '$Author.last_name$': { [Op.substring]: query } } ] } }) .then((books) => res.json(books)) .catch((err) => { console.log(err); res.status(500).json(err); }); },
如果你的Book和Author关联时设置了别名,比如Book.belongsTo(Author, { as: 'writer' }),把$中间的Author替换成别名writer即可:'$writer.first_name$'。
方法2:使用sequelize.col显式指定字段
如果需要更严谨的字段引用方式,可以用Sequelize实例的col方法指定关联表字段:
// 这里的sequelize是你初始化的Sequelize实例 [Op.or]: [ { title: { [Op.substring]: query } }, sequelize.where(sequelize.col('Author.first_name'), Op.substring, query), sequelize.where(sequelize.col('Author.last_name'), Op.substring, query) ]
注意事项
- 必须在
include中配置了对应的关联模型,否则关联表字段还是无法识别 - 即使是一对多关联(如一本书对应多个作者),上述写法也会正常命中,只要有一个作者的名字匹配就会返回对应书籍信息
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

