使用Knex.js和SQL并具有多个搜索条件的条件过滤器

ota*_*jor 5 javascript sql node.js knex.js

我有一个我的用户需要能够搜索的项目数据库。他们可以将不同的过滤器,例如categorysearchTermitemType

我知道如何在knex查询中应用这些过滤器,但是不确定如何有条件地组合它们。例如,在一种情况下,用户仅输入searchTerm。因此,我不想按类别或项目类型进行筛选,而仅按searchTerm进行过滤。但是,我只希望有一个knex函数,可以有条件地向查询中添加额外的子句。

就像是:

const getFilteredItems = (searchCriteria) => knex('items')
   // IF (searchCriteria.searchTerm)
  .where('items.itemName', 'like', `%${searchCriteria.searchTerm}%`)
  // IF (searchCriteria.itemType)
  .where('items.itemType', '=', searchCriteria.itemType)
  // IF (searchCriteria.category)
  .where('items.category', '=', searchCriteria.category)
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何有条件地将额外的where子句附加到knex查询中。有没有编写原始SQL的优雅方法?

Gan*_*ead 8

您可以使用knex查询构建器有条件地构建查询:

const getFilteredItems = (searchCriteria) => knex('items')
  .where((qb) => {
    if (searchCriteria.searchTerm) {
      qb.where('items.itemName', 'like', `%${searchCriteria.searchTerm}%`);
    }

    if (searchCriteria.itemType) {
      qb.orWhere('items.itemType', '=', searchCriteria.itemType);
    }

    if (searchCriteria.category) {
      qb.orWhere('items.category', '=', searchCriteria.category);
    }
  });
Run Code Online (Sandbox Code Playgroud)

您也可以使用this@abdulbarik给出的示例,而不是接受querybuilder参数,但是我认为它不太明确。