Sequelize中where的Op.or条件包含关联表user.name字段报错如何解决
报错原因
直接将关联表user的字段写在主表flights的where条件中时,Sequelize默认会把"user.name"识别为flights表下的字段,最终生成的SQL中字段名被拼接为flights.user.name,因此抛出未知字段的错误。
解决方案
使用$包裹关联表字段路径,即可让Sequelize正确识别为关联表的字段,适配跨主表、关联表的Op.or查询逻辑,修改后的代码如下:
const conditionObj = { [Op.or]: [ { source: { [Op.like]: `%${text}%` } }, { destination: { [Op.like]: `%${text}%` } }, // 用$包裹关联表字段路径,正确匹配关联表的name字段 { "$user.name$": { [Op.like]: `%${text}%` } } ] }; const list = await db.flights.findAndCountAll({ where: conditionObj, attributes: [ "id", "source", "destination" ], include: [ { association: "user", attributes: ["id", "name", "mobile", "email"] // 不要把user的筛选条件写在这里,否则会变成AND逻辑 }, ] });
兼容方案
如果你的Sequelize版本较旧不支持$语法,可以用Sequelize.literal手动指定字段实现同样效果:
// 替换$user.name$的条件写法 { [Op.or]: Sequelize.literal(`user.name LIKE '%${text}%'`) }
注意:使用
literal拼接SQL时建议做好参数校验,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

