首页 > 解决方案 > 如何使用 Sequelize 查询包含子类别产品的类别下的所有产品

问题描述

伙计们。我正在使用 nodejs 和 sequelize 开发电子商务。我需要一些帮助,我的问题是:如何使用 sequelize 查询一个类别下的所有产品,包括子类别的产品?

我正在使用 sequelizeV5 和 'sequelize-hierarchy' npm 包

到目前为止,我有这个:

async categoryAllProducts(req, res) {
        try {
            let category_id = req.params.id;
            let categories = await models.Category.findAll({
                where: sequelize.literal(`id=${category_id} OR parent_id = ${category_id}`)
            });

            await Promise.all(categories.map(async (category)=> {
                let items = await category.getProducts({
                    offset: req.query.offset || 0,
                    limit: req.query.limit || 10,
                    where: req.query.filter ? sqs.find(req.query.filter) : {},
                    order: req.query.sort ? sqs.sort(req.query.sort) : [['id', 'asc']]
                });
                category.dataValues.products = items;
            }));

            return ReS(res, {data: categories}, 200);
        } catch (error) {
            return ReE(res, error, 400);
        }
    },

但在这一点上,我不能随意使用limit和offset,并且在不同的子类别中存在相同产品的重复。而且,效率也不高。有什么建议吗?

标签: node.jssequelize.js

解决方案


我希望我能理解你的问题。我认为你应该这样做。

async categoryAllProducts(req, res) {
    try {
        let category_id = req.params.id;

        const products = await models.Product.findAll({
           include: [{
              model: models.Category,
              // you should use sequelize.Op
              where: sequelize.literal(`id=${category_id} OR parent_id = ${category_id}`)
           }],
           offset: req.query.offset || 0,
           limit: req.query.limit || 10,
           order: req.query.sort ? sqs.sort(req.query.sort) : [['id', 'asc']]
        })

        return ReS(res, {data: products}, 200);
    } catch (error) {
        return ReE(res, error, 400);
    }
},

推荐阅读