2016-10-05 33 views
1

私はユーザが検索する必要があるアイテムのデータベースを持っています。彼らはcategory,searchTerm,itemTypeのような異なるフィルタを適用することができます。複数の検索条件でKnex.jsとSQLを使用する条件付きフィルタ

これらのフィルタのそれぞれをknexクエリに適用する方法はわかっていますが、条件付きでそれらを組み合わせる方法はわかりません。例えば。あるケースでは、ユーザーはsearchTermのみを入力します。だから私はカテゴリや項目の種類ではなく、searchTermでフィルタリングしたくありません。しかし、私は条件付きでクエリに余分な節を追加するknex関数を1つだけ持ちたいと思う。

ような何か:

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) 

しかし、私は条件付きでknexクエリに余分なwhere句を追加するかどうかはわかりません。生のSQLを書くことなくこれを行うエレガントな方法はありますか?

答えて

1

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

また与えた@abdulbarikの例のようにquerybuilder引数を受け入れるthisの代わりに使用することができますが、私はそれがあまり明示的であると思います。

+0

ありがとう、これは動作します:) – otajor

1

あなたが次のことを試すことができ

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

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) 

orWhereを試してみて、これに基づいてクエリを更新:

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

任意のパラメータが欠落しているかundefinedされた場合、それは偽者と一致しますldは'%%'のようになります。つまり、このパラメータを気にしないでください。あなたは条件付きでknexクエリビルダを使用してクエリを構築することができ