You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用Sequelize如何关联查询订单表对应products表的产品数据

实现方案

你当前使用的是Sequelize ORM操作数据库,要实现订单关联商品查询,按以下两步操作即可:

步骤1:配置模型关联关系

首先需要在两个模型的定义文件中声明外键关联:

  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;
};
  1. 可选配置:如果需要从商品侧反向关联订单,在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:24:03