【问题标题】:Getting filters from database to filter database if no filter query is specified [Express js] [Postgresql] [Knex]如果未指定过滤器查询,则从数据库中获取过滤器以过滤数据库 [Express js] [Postgresql] [Knex]
【发布时间】:2022-08-24 14:18:00
【问题描述】:

我想知道使用 knex whereIn 动态获取过滤器数组以过滤数据库的最佳选择是什么。 我应该在 Postgres 中再创建一个表并在其中使用过滤器数组分隔列,还是有更好的解决方案?

const getSpecialsits = (req, res) => {

const page = req.query.page || 1
const limit = req.query.limit || 28
const city = req.query.city || \"All\"

pool.select(\'*\')
    .from(\'person\')
    .limit(limit)
    .offset((page - 1) * limit)
    .whereIn(\'city\', city_array)
    .then((data) => {
        res.json(data);
    })
    .catch((err) => {
        console.log(err);
    });
};

module.exports = {
    getSpecialsits,
};

例如这里我想从数据库中获取城市数组。 if (city === \"All\") then city_array 将从数据库中抓取,无论如何都会从数据库中抓取它以检查城市是否存在。 谢谢

    标签: javascript postgresql express knex.js


    【解决方案1】:

    knex modify 是要走的路,它需要查询构建器参数,然后您可以执行以下操作:

    将过滤器构建为{criteria: column, values: ['a','b']} 的数组

    .modify(queryBuilder => {
    
        if (filtersArr.length > 0) {
            filtersArr.forEach(({criteria, values}) => {
                queryBuilder.whereIn(criteria, values)
    
            }
        }
    })
    

    这就是动态部分,至于如何存储像allnorth 城市集合这取决于你,我有一个nullnot-null 检查执行empty 或@ 的值987654329@ 过滤,其中有更多复杂性,例如您需要如何在条件之前附加表名并最后按 id 分组,但它看起来像这样:

    if (values.includes('null')) {
        queryBuilder.havingNull(criteria)
    } else if (values.includes('not_null')) {
        queryBuilder.havingNotNull(criteria)
    } else {
        queryBuilder.havingIn(criteria, values)
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多