【问题标题】:Products filter node js + sequelize产品过滤节点js+sequelize
【发布时间】:2021-08-19 05:03:41
【问题描述】:

我正在使用节点 js + sequelize。我想按供应商、价格、交货选项等选择的选项过滤产品的结果,但我不明白如何使查询准确。

现在我正在这样做,但此方法仅在选择所有过滤器时才有效(AND 运算符)。如果用户只选择了 1 个过滤器,或者其中几个过滤器,我该怎么办?

    let vendor = req.query.vendor;
    let priceFrom = req.query.priceFrom;
    let priceTo = req.query.priceTo;
    let delivery = req.query.delivery

            Product.findAll({
                where: {
                    vendor_id: {
                        in: vendor
                    },
                    price: {
                        $between: [priceFrom, priceTo]
                    },
                    {
                    delivery: delivery 
                    }
                }
            }).then(products => {
                res.render('product', {products: products});
                console.log(products)
            });

我现在看到唯一的一种方法可以为每个场合编写大量 if-else 语句。

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    首先,检查查询参数并根据这些查询参数创建一个对象,例如:

    let vendor = req.query.vendor;
    let priceFrom = req.query.priceFrom;
    let priceTo = req.query.priceTo;
    let delivery = req.query.delivery
    let options = { where: {} };
    if (vendor)
        options.where.vendor_id = {$in: vendor}
    if (priceFrom && priceTo)
        options.where.price = {$between: [priceFrom, priceTo]}
    if (delivery)
        options.where.delivery = delivery
    Product.findAll(options)
      .then(products => {
          console.log(products)
          res.render('product', { products: products });
      });
    

    【讨论】:

    【解决方案2】:

    您也可以使用odata-sequelize 之类的包。它简化了过滤过程。

    var parseOData = require("odata-sequelize");
    var sequelize = require("sequelize");
    var query = parseOData(
      "$top=5&$skip=1&$select=Foo,Bar&$filter=Foo eq 'Test' or Bar eq 'Test'&$orderby=Foo desc",
      sequelize
    );
    

    这会产生

    {
        attributes: ['Foo', 'Bar'],
        limit: 5,
        offset: 1,
        order: [
            ['Foo', 'DESC']
        ],
        where: {
            [Op.or]: [
                {
                    Foo: {
                        [Op.eq]: "Test"
                    }
                },
                {
                    Bar: {
                        [Op.eq]: "Test"
                    }
                }
            ]
        }
    }
    

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 谢谢,我现在添加了示例代码
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多