связать многих со многими, не правильно работая с устаревшей базой данных - PullRequest
0 голосов
/ 25 июня 2019

У меня есть существующая база данных mysql, где у меня есть следующие таблицы: category, product и product_category. Я использовал пакет sequelizer-auto для генерации моделей из 3 таблиц, как показано ниже: :

Product.js, модель, сгенерированная из 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 сгенерировано из «таблицы категорий»

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 из 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'
    });
};

А вот и категория контроллера 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);
        }
    });
}

Все методы работают должным образом, но после добавления связи между моделями у меня возникли некоторые проблемы. Сначала в GET /categories реализация запроса была const categories = await Category.findAll(), и все работало нормально, но после изменения реализации на const categories = await Category.findAll({include:{model:Product,as:'products'}}); я получаю следующую ошибку { "error": { "name": "SequelizeEagerLoadingError" } }

Я пытался прочитать много тем и решений, но у меня всегда одно и то же issue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...