web-dev-qa-db-ja.com

where()句を条件付きでknexクエリに追加できますか?

クエリにwhere()句を追加したいのですが、条件付きです。具体的には、URLで特定のクエリ文字列パラメータが渡された場合にのみ追加してください。これは可能ですか?可能であれば、どうすればそれを実行できますか?

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

次のように、クエリを変数に保存し、条件付き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);
  });
});
27
Simon Briche

はい。 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);
        });
});
70
Itai Noam

実際に.where()内でクエリビルダーを使用できます。

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

IMO @ItaiNoamの回答は.modify()で正しいはずです

1
Merey Nurlan