2016-05-31 11 views
0

私はユーザーが複数のパラメータで検索できるようにする関数を作成しようとしています。ここにコードがあります。bookshelf.jsクエリでorWhereRawを複数回使用することはできますか?

async function searchUsers(searchText) { 
    if(isNaN(searchText)){ 
    searchText = "'%" + searchText + "%'"; 
    } else { 
    searchText = searchText; 
    } 

    let results = await User.query({whereRaw: ' (`firstName` LIKE ' + searchText , orWhereRaw: '`lastName` LIKE ' + searchText 
    , orWhereRaw: '`username` LIKE' + searchText, orWhereRaw: '`providerId` =' + searchText + ")"}).fetchAll(); 

    return results.toJSON(); 
} 

この機能を実行すると、これは私のコマンドラインに表示されます。

sql: 'select `users`.* from `users` where (`firstName` LIKE 1 or `providerId` =1)' } 

わかりやすく、クエリにはfirstNameとproviderIdのみが含まれています。 lastNameまたはusernameの記述はありません。

どのようにすべてのパラメータを含めることができますか?

答えて

0

エラーは、同じオブジェクトで同じキーを2回使用しています。第2は第1を上書きする。

assert.deepEqual({ a: true }, { a: false, a: true }); 

この種の問題を防ぐためにリンターを使用してください。

ソリューション:

let results = await User.query(queryBuilder => queryBuilder 
    .whereRaw('`firstName` LIKE ?', searchText) 
    .orWhereRaw('`lastName` LIKE ?', searchText) 
    .orWhereRaw('`username` LIKE ?', searchText) 
    .orWhereRaw('`providerId` = ?', searchText) 
).fetchAll(); 

それは文句を言わないあなたが望む括弧を生成するが。あなたは、あなたがやっていることに対して生の質問をする必要はありません。それはかなり標準的なものです。

let results = await User 
    .where('firstName', 'like', searchText) 
    .orWhere(function() { 
    this.where('firstName', 'like', searchText) 
     .orWhere('lastName' 'like', searchText) 
     .orWhere('username', 'like', searchText) 
     .orWhere('providerId', searchText) 
    }); 
) 
).fetchAll(); 

詳細については、Knex docsを参照してください。

関連する問題