Node.js使用Sequelize如何关联查询订单表对应products表的产品数据
实现方案
你当前使用的是Sequelize ORM操作数据库,要实现订单关联商品查询,按以下两步操作即可:
步骤1:配置模型关联关系
首先需要在两个模型的定义文件中声明外键关联:
- 打开
models/orders.js订单模型文件,添加关联配置:
module.exports = (sequelize, DataTypes) => { const Orders = sequelize.define('orders', { // 你原来的字段定义保持不变 sender_user_id: DataTypes.INTEGER, order_status: DataTypes.STRING, product_id: DataTypes.INTEGER, // 其他原有字段... }, {}); // 新增关联配置 Orders.associate = (models) => { // 订单关联商品,外键为订单表的product_id,关联商品表的product_id字段 Orders.belongsTo(models.products, { foreignKey: 'product_id', targetKey: 'product_id', as: 'product_info' // 返回数据中商品信息的字段名,可自定义 }); }; return Orders; };
- 可选配置:如果需要从商品侧反向关联订单,在
models/products.js中添加:
Products.associate = (models) => { Products.hasMany(models.orders, { foreignKey: 'product_id', sourceKey: 'product_id' }); };
步骤2:修改查询逻辑,加入关联查询
修改你现有的orderDetails方法,在findAll查询参数中添加include配置引入关联的商品模型即可,优化后的完整代码如下:
const db = require('../../models') const Orders = db.orders const Products = db.products const orderDetails = async (req, res) => { try { const { sender_user_id, order_status } = req.body // 用await替代原来的.then链式调用,代码更简洁 const orderList = await Orders.findAll({ where: { sender_user_id, order_status }, // 关联查询商品信息 include: [{ model: Products, as: 'product_info', // 和模型中定义的别名保持一致,没定义别名则删除该字段 // 可选:指定需要返回的商品字段,不配置则返回商品表全部字段 attributes: ['product_id', 'product_name', 'price', 'stock', 'cover_image'] }] }) if (!orderList || orderList.length === 0) { return res.status(400).send({ status: "102", message: "未查询到符合条件的订单" }) } res.status(200).send({ status: "VB100", orders: orderList }) } catch (err) { console.error(err.message) res.status(500).send({ status: "102", msg: err.message }) } } module.exports = { orderDetails }
注意事项
- 如果你没有在模型中定义
as别名,include配置中不需要写as字段 - 不需要返回商品全部字段时,建议配置
attributes指定返回字段,减少不必要的字段查询提升性能 - 原来的代码混用
async和.then写法容易逻辑混乱,优化后统一用await写法更易维护
内容的提问来源于stack exchange,提问作者Kirti Palve
相关产品推荐
相关产品推荐

