如何将MySQL原生关联查询转换为正确的Sequelize ORM查询?
问题原因
- 模型关联代码
hasMany和belongsTo不能写在接口处理方法内部,关联关系需要在模型定义阶段全局声明,放在方法内不会生效,也就无法自动生成join语句 - 没有在
findAll参数中声明要关联查询Departments表,所以默认只会查询products单表数据 - 没有指定查询字段,默认会返回表的所有字段,和预期的原生SQL查询字段不一致
- 原代码中
Product.belongsTo(Department)存在模型名拼写错误,需要和实际定义的模型名保持一致
修正步骤
第一步:提前声明模型关联
关联关系只需要声明一次,放在两个模型的定义代码之后即可,不要放在接口方法内:
Departments.hasMany(Product, { foreignKey: 'id_dep' }) // 注意外键要显式声明,和你数据库的关联字段对应 Product.belongsTo(Departments, { foreignKey: 'id_dep' })
第二步:调整接口查询代码
async productByDep(req,res){ try { const { id } = req.params; const products = await Product.findAll({ // 指定products表需要返回的字段,和原生SQL对应 attributes: ['name', 'descricao', 'disponivel', 'destaque', 'estoque'], where: { id_dep: id }, // 配置关联查询部门表 include: [{ model: Departments, // 仅返回需要的部门名字段 attributes: ['name_department'], // 强制使用inner join,默认关联为left join required: true }], // 可选配置:如果不需要嵌套的部门对象,加下面两个参数可以扁平化返回结果 // raw: true, // nest: true }) res.status(200).json(products) } catch (err) { res.status(500).json({ error: '查询失败', msg: err.message }) } }
额外注意事项
你给出的原生SQL中存在拼写错误:produts.estoque少了字母c,实际写代码时要注意字段名和数据库保持一致,避免查询报错。
内容的提问来源于stack exchange,提问作者Leandro Dias
相关产品推荐
相关产品推荐

