簡體   English   中英

我可以有條件地向 knex 查詢添加 where() 子句嗎?

[英]Can I conditionally add a where() clause to my knex query?

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

是的。 使用修改

適用於您的示例:

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 子句然后執行它,如下所示:

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

您實際上可以在 .where() 中使用查詢構建器,如下所示:

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

IMO @ItaiNoam 的答案應該是正確的.modify()

最簡單的解決方案是skipUndefined

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

您可以通過檢查您的查詢字符串是否存在並運行不同的查詢來實現。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM