NodeJS 我可以有条件地在knex查询中添加where()子句吗?

yuvru6vn  于 2023-02-18  发布在  Node.js
关注(0)|答案(5)|浏览(562)

我想在我的查询中添加一个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);
        });
});
kx7yvsdv

kx7yvsdv1#

是的。使用修改。
应用于您的示例:

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);
        });
});
sqougxex

sqougxex2#

您可以将查询存储在变量中,应用条件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);
  });
});
z9smfwbn

z9smfwbn3#

实际上可以在.where()中使用queryBuilder,如下所示:

.where((queryBuilder) => {condition === true ? do something if true : do something if false })

IMO @ItaiNoam的答案应该是.modify()的正确答案

a7qyws3x

a7qyws3x4#

最简单的解决方案是skipUndefined

Person.query()
  .skipUndefined()
  .where('firstName', req.query.firstName);
ddarikpa

ddarikpa5#

您可以通过检查查询字符串是否存在并运行其他查询来完成此操作。

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);
      });
  }
}
});

相关问题