クエリにwhere()
句を追加したいのですが、条件付きです。具体的には、URLで特定のクエリ文字列パラメータが渡された場合にのみ追加してください。これは可能ですか?可能であれば、どうすればそれを実行できますか?
router.get('/questions', function (req, res) {
knex('questions')
.select('question', 'correct', 'incorrect')
.limit(50)
.where('somecolumn', req.query.param) // <-- only if param exists
.then(function (results) {
res.send(results);
});
});
次のように、クエリを変数に保存し、条件付きwhere句を適用してから実行できます。
router.get('/questions', function(req, res) {
var query = knex('questions')
.select('question', 'correct', 'incorrect')
.limit(50);
if(req.query.param == some_condition)
query.where('somecolumn', req.query.param) // <-- only if param exists
else
query.where('somecolumn', req.query.param2) // <-- for instance
query.then(function(results) {
//query success
res.send(results);
})
.then(null, function(err) {
//query fail
res.status(500).send(err);
});
});
はい。 modify を使用します。
あなたの例に適用されるように:
router.get('/questions', function (req, res) {
knex('questions')
.select('question', 'correct', 'incorrect')
.limit(50)
.modify(function(queryBuilder) {
if (req.query.param) {
queryBuilder.where('somecolumn', req.query.param);
}
})
.then(function (results) {
res.send(results);
});
});
実際に.where()内でクエリビルダーを使用できます。
_.where((qb) => {condition == true ? do something if true : do something if false })
_
IMO @ItaiNoamの回答は.modify()
で正しいはずです