有条件的filter使用Knex.js和SQL以及多个search条件
我有我的用户需要能够search的项目数据库。 他们可以应用不同的filter,如category
, searchTerm
, itemType
。
我知道如何在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
,它将匹配字段为'%%'
,这有效地意味着,不关心这个参数。