有条件的filter使用Knex.js和SQL以及多个search条件

我有我的用户需要能够search的项目数据库。 他们可以应用不同的filter,如categorysearchTermitemType

我知道如何在knex查询中应用这些filter,但不知道如何有条件地合并它们。 例如,在一种情况下,用户只inputsearchTerm。 所以我不想按类别或项目types进行筛选,而只需要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) 

但我不知道如何有条件地将附加的where子句追加到knex查询中。 有没有一个优雅的方式来做到这一点,而不写入原始的SQL?

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

 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); } }); 

你也可以用this来代替@abdulbarik给出的例子,而不是接受一个querybuilder参数,但是我认为它不够明确。

尝试orWhere并在此基础上更新您的查询

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

 knex('users').where(function() { this.where('id', 1).orWhere('id', '>', 10) }).orWhere({name: 'Tester'}) 

您可以尝试以下方法:

 const getFilteredItems = (searchCriteria) => knex('items') .where('items.itemName', 'like', `%${searchCriteria.searchTerm || ''}%`) .where('items.itemType', 'like', `%${searchCriteria.itemType || ''}%`) .where('items.category', 'like', `%${searchCriteria.category || ''}%`) 

如果有任何参数丢失或undefined ,它将匹配字段为'%%' ,这有效地意味着,不关心这个参数。