Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以有条件地将where()子句添加到knex查询中吗?_Javascript_Node.js_Knex.js - Fatal编程技术网

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

Javascript 我可以有条件地将where()子句添加到knex查询中吗?,javascript,node.js,knex.js,Javascript,Node.js,Knex.js,我想在查询中添加一个where()子句,但有条件地添加。具体地说,我只希望在URL中传递sepecific querystring参数时添加它。这可能吗?如果可能,我将如何着手 router.get('/questions', function (req, res) { knex('questions') .select('question', 'correct', 'incorrect') .limit(50) .where('somec

我想在查询中添加一个
where()
子句,但有条件地添加。具体地说,我只希望在URL中传递sepecific 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);
        });
});
router.get('/questions',函数(req,res){
knex(“问题”)
.选择('问题'、'正确'、'不正确')
.限额(50)

.where('somecolumn',req.query.param)/您可以通过检查查询字符串是否存在并运行其他查询来完成此操作

router.get('/questions',函数(req,res){
if(req.query.yourQueryString){
//运行更具体的选择
}否则{
knex(‘问题’)。选择(‘问题’、‘正确’、‘不正确’)。限制(50)。其中(

“somecolumn”,req.query.param)//您可以将查询存储在变量中,应用条件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);
  });
});
router.get('/questions',函数(req,res){
var query=knex('问题')
.选择('问题'、'正确'、'不正确')
.限额(50);
if(req.query.param==some_条件)
query.where('somecolumn',req.query.param)/Yes。使用

适用于您的示例:

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()中使用查询生成器,如下所示:


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

谢谢!我想应该是:if(req.query.param){queryBuilder.where('somecolumn',req.query.param);}这是一种完美的方法。绝对应该是公认的答案。比公认的答案好得多!KNEX文档应该添加这种使用方式。修改-为了支持有条件地应用查询功能,请同时检查其他答案!我可以问一下为什么这种方法的投票率较低吗?这种方法是否有特定的缺点?因为它eems更加干净,允许使用
wait
@bzupnick
。modify()
构造使您完全处于knex提供的查询生成器API中,这似乎比使用JavaScript解决方案“越野”更干净。knex文档声明
modify()
“允许将查询片段和常见行为作为函数进行封装和重用。”因为您提到
wait
是一个可取的功能:带有
modify
子句的knex查询也可以
wait
.where((qb) => {condition == true ? do something if true : do something if false })