Могу ли я условно добавить предложение 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);
      });
  }
}
});