Search code examples
mysqlsqlnode.jssequelize.jssequelize-cli

Sequelize include options cannot get another models


I have two model that are belongs to each other (order_items.js & products.js) productId as a foreign key in order_items, code as below:

order_items.js

const { DataTypes } = require('sequelize')
const db_config = require(`../config/config`)
const Product = require('./product')

const OrderItem = db_config.define('order_item', {
productId : { type: DataTypes.INTEGER, allowNull:false, references: {model: Product, key: 'id'} },
quantity: { type: DataTypes.INTEGER }
}, {
freezeTableName: true
})


module.exports = OrderItem

product.js

const { DataTypes } = require('sequelize')
const db_config = require(`../config/config`)
const Category = require('./category')

const Product = db_config.define('product', {
productName : { type: DataTypes.STRING, allowNull:false },
productPrice: { type: DataTypes.INTEGER, allowNull:false },
productDescription: { type: DataTypes.STRING, allowNull:true },
productImage: { type: DataTypes.STRING, allowNull:true },
productStock: { type: DataTypes.INTEGER, validate: { min: 0 }, defaultValue: 0, allowNull: false },
CategoryId: { type: DataTypes.INTEGER, allowNull:false, defaultValue: 1, references: {model: Category, key: 'id'}}
}, {
freezeTableName: true

})

module.exports = Product

order_routes.js

router.get('/', async (req, res) => {
try {
  const dataList =  await OrderItem.findAll({include: [{model:Product, required:true}]})
  res.send({
      status: "success",
      message: "data found",
      data: dataList
  }) 
} catch (err) {
    res.send({
        status: "failed",
        message: err})
}
})

Result in postman

enter image description here

Can anyone help please? what I'm trying to do is that when I get the order_item, it also get the products refers to the id of the products


Solution

  • Where are the associations in the model definition? I see a reference on column field but you also needs to do below definitions seperately

    Inside OrderItem Model File

        OrderItem.associate = models => {
    
            OrderItem.belongsTo(Product, {as: "product", foreignKey: "productId", sourceKey: "id"});
    
    };
    

    Inside Products Model File

        Product.associate = models => {
    
            Product.hasMany(OrderItem, {as: "orders", foreignKey: "productId", sourceKey: "id"});
    
    };
    
    
    

    Also I would suggest you to store price in OrderItem collection as well so in case in future when the product price changes your past order data is not incorrect.