【问题标题】:Sequelize hasMany association not workingSequelize hasMany 关联不起作用
【发布时间】:2021-08-26 00:40:39
【问题描述】:

我有一个产品模型:

   module.exports = (sequelize, Sequelize) => {
       const Product = sequelize.define("product", {
          SKU: {
             type: Sequelize.STRING,
          },
          name: {
             type: Sequelize.STRING,
          },
          description: {
             type: Sequelize.TEXT,
          },
          categoryID: {
             type: Sequelize.INTEGER,
          }
       });
       Product.associate = function (models) {
          Product.hasMany(models.Stock, { foreignKey: 'productID', as: 'stocks' })
       };
       return Product;
    }

Stock 模型有hasMany 关系:

module.exports = (sequelize, DataTypes) => {
   const Stock = sequelize.define("stock", {
      note:  DataTypes.STRING,
      })
   Stock.associate = function (models) {
      Stock.belongsTo(models.Product)
   };
   return Stock;
}

在尝试查询产品时,我收到以下错误:

exports.getAllAvailableProducts = (req, res) => {
      const queryParams = req.query;
      Product.findAll({
         include: ['stocks'],
         where: queryParams
      }).then((products) => {
         res.status(200).send(products);
      })
};


(node:58108) UnhandledPromiseRejectionWarning: Error: Association with alias "stocks" does not exist on product

我在这里做错了吗?我也没有看到 FK 出现在我的数据库中

【问题讨论】:

    标签: node.js sequelize.js associations


    【解决方案1】:
     module.exports = (sequelize, Sequelize) => {
           const Product = sequelize.define("product", {
              SKU: {
                 type: Sequelize.STRING,
              },
              name: {
                 type: Sequelize.STRING,
              },
              description: {
                 type: Sequelize.TEXT,
              },
              categoryID: {
                 type: Sequelize.INTEGER,
              }
           });
           Product.associate = function (models) {
              // models.stock is correct
              Product.hasMany(models.stock, { foreignKey: 'productID', as: 'stocks' })
           };
           return Product;
        }
    
    module.exports = (sequelize, DataTypes) => {
       const Stock = sequelize.define("stock", {
          note:  DataTypes.STRING,
          })
       Stock.associate = function (models) {
          // models.product is correct
          //Stock.belongsTo(models.product)
          Stock.belongsTo(models.product, {
              foreignKey: 'productId',
              as: 'product'
        })
       };
       return Stock;
    }
    

    模型/index.js

    const dbConfig = require("../config/db.config.js");
    
    const Sequelize = require("sequelize");
    const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
       host: dbConfig.HOST,
       dialect: dbConfig.dialect,
       operatorsAliases: false,
    
       pool: {
          max: dbConfig.pool.max,
          min: dbConfig.pool.min,
          acquire: dbConfig.pool.acquire,
          idle: dbConfig.pool.idle
       }
    });
    
    const db = {};
    
    db.Sequelize = Sequelize;
    db.sequelize = sequelize;
    db.user = require("./user.model.js")(sequelize, Sequelize);
    db.category = require("./category.model.js")(sequelize, Sequelize);
    db.product = require("./product.model.js")(sequelize, Sequelize);
    db.orderline = require("./orderline.model.js")(sequelize, Sequelize);
    db.order = require("./order.model.js")(sequelize, Sequelize);
    db.stock = require("./stock.model.js")(sequelize, Sequelize);
    
    // we need call associate function
    db.stock.associate(db)
    db.product.associate(db);
    
    module.exports = db;
    
        Product.findAll({
             include: ['stocks'],
             where: queryParams
          }).then((products) => {
             res.status(200).send(products);
          })
    

    【讨论】:

    • 或者,请查看https://github.com/nkhs/node-sequelize,那里有很多例子
    • 我发现了主要问题,models/index.js 不足以运行associate function
    • 索引中缺少什么?
    • 请使用https://github.com/nkhs/node-sequelize/blob/master/models/index.js
    • 属于需要forieginKeyas,所以,我更新了我的答案
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多