sequelize many to many not working correcttly with a legacy databse

242 Views Asked by At

I've got an existing mysql database where i've got the following tables : category,product and product_category.I've used sequelizer-auto package to generate models from the 3 tables like the following:

Product.js ,model generated from product table:

module.exports = function(sequelize, DataTypes) {
    const Product= sequelize.define('product', {
        productId: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true,
            field: 'product_id'
        },
        name: {
            type: DataTypes.STRING(100),
            allowNull: false,
            field: 'name'
        },
        description: {
            type: DataTypes.STRING(1000),
            allowNull: false,
            field: 'description'
        },
        price: {
            type: DataTypes.DECIMAL,
            allowNull: false,
            field: 'price'
        },
        discountedPrice: {
            type: DataTypes.DECIMAL,
            allowNull: false,
            defaultValue: '0.00',
            field: 'discounted_price'
        },
        image: {
            type: DataTypes.STRING(150),
            allowNull: true,
            field: 'image'
        },
        image2: {
            type: DataTypes.STRING(150),
            allowNull: true,
            field: 'image_2'
        },
        thumbnail: {
            type: DataTypes.STRING(150),
            allowNull: true,
            field: 'thumbnail'
        },
        display: {
            type: DataTypes.INTEGER(6),
            allowNull: false,
            defaultValue: '0',
            field: 'display'
        }
    }, {
        tableName: 'product'
    });

    Product.associate=(models)=>{
        Product.belongsToMany(models.category,{
            through:'product_category',
            foreignkey:'product_id',
            as:'categories'
        })
    }

    return Product;
};

Category.js generated from 'category table'

module.exports = function(sequelize, DataTypes) {
    const Category= sequelize.define('category', {
        categoryId: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            primaryKey: true,
            autoIncrement: true,
            field: 'category_id'
        },
        departmentId: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            field: 'department_id'
        },
        name: {
            type: DataTypes.STRING(100),
            allowNull: false,
            field: 'name'
        },
        description: {
            type: DataTypes.STRING(1000),
            allowNull: true,
            field: 'description'
        }
    },
    {
        tableName: 'category',
    });

    Category.associate=(models)=>{
        Category.belongsToMany(models.Product, {
            through: 'product_category',
            foreignkey: 'category_id',
            as: 'products'
        });
    }

    return Category;
};

ProductCategory from product_category table

module.exports = function(sequelize, DataTypes) {
    return sequelize.define('product_category', {
        productId: {
            type: DataTypes.INTEGER(11),
            references:{
                key:'product_id',
                model:'product'
            }
        },
        categoryId: {
            type: DataTypes.INTEGER(11),
            references:{
                key: 'category_id',
                model:'category'
            }

        }
    }, {
        tableName: 'product_category'
    });
};

And here is the category controller categories.js:

const db=require('../services/db_init');
const DataTypes=require('sequelize').DataTypes;
const Category=require('../database/models/Category')(db,DataTypes);
const Product=require('../database/models/Product')(db,DataTypes);
const {category_errors:{cat_01,cat_02}} = require('../services/errors.js');

//test code
const Product = require('../database/models/Product')(db,DataTypes);

module.exports=(app)=>{
    app.get('/categories',async(req,res)=>{
        try {
            const categories = await Category.findAll({
                include:{
                    model:Product,
                    as:'products'
                }
            });
            return res.send(categories).status(200);
        } catch (err) {
            return res.json({error:err}).status(400);
        }
    });

    app.get('/categories/:id',async(req,res)=>{
        const id=req.params.id;

        //checking if the id is a number
        if(isNaN(id)){
            return res.json({error:cat_01})//error returned
        }

        try {
            const category=await Category.findByPk(id);
            if(category){
                return res.send(category).status(200);
            }
            return res.json({error:cat_02}).status(404);
        } catch (err) {
            return res.json(err).status(400);
        }
    });
}

All methode are working as expected,but after adding relashionship between models i've got some problems.First in GET /categories ,the implementation of the query was const categories = await Category.findAll() and everything was working fine,but after changing the implementation to const categories = await Category.findAll({include:{model:Product,as:'products'}}); i get the follwing error { "error": { "name": "SequelizeEagerLoadingError" } }

I've tried to read many topics,and solutions but i always have the same issue

0

There are 0 best solutions below