我想在查询中添加where()
子句,但有条件。具体来说,我希望只有在URL中传递了一个特定的querystring参数时才添加它。这是可能的,如果是的话,我该怎么做呢?
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);
});
});
答案 0 :(得分:49)
是。使用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);
});
});
答案 1 :(得分:20)
您可以将查询存储在变量中,应用条件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);
});
});
答案 2 :(得分:0)
您实际上可以在.where()内部使用查询生成器,如下所示:
.where((qb) => {condition == true ? do something if true : do something if false })
IMO @ItaiNoam的答案应为.modify()
正确
答案 3 :(得分:0)
最简单的解决方案是skipUndefined
Person.query()
.skipUndefined()
.where('firstName', req.query.firstName);
答案 4 :(得分:-7)
您可以通过检查查询字符串是否存在并运行不同的查询来完成此操作。
router.get('/questions', function(req, res) {
if (req.query.yourQueryString) {
// Run your more specific select
} else {
knex('questions').select('question', 'correct', 'incorrect').limit(50).where(
'somecolumn', req.query.param) // <-- only if param exists
.then(function(results) {
res.send(results);
});
}
}
});
&#13;