Могу ли я условно добавить предложение where() к моему конусообразному запросу?
Я хочу добавить предложение 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);
});
});
Ответы
Ответ 1
Вы можете сохранить свой запрос в переменной, применить условие conditional 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
Да. Используйте 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);
});
});
Ответ 3
Вы можете сделать это, проверив, присутствует ли ваша строка запроса и выполняется другой запрос.
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);
});
}
}
});