2014-12-01 19 views
11

Chcę dodać klauzulę where() w moim zapytaniu, ale warunkowo. W szczególności chcę, aby był on dodawany tylko wtedy, gdy w adresie URL przekazywany jest specyficzny parametr zapytania. Czy to możliwe, a jeśli tak, to jak mam to zrobić?Czy mogę warunkowo dodać klauzulę where() do mojego zapytania knex?

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

Odpowiedz

5

można zapisać zapytanie w zmiennej, stosuje swoją warunkowy gdzie klauzula, a następnie wykonać ją tak:

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

Można to zrobić, sprawdzając, czy ciąg zapytania jest obecny i uruchamiając inne zapytanie.

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

19

Tak. Użyj modify.

Jako stosowane do np

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

Dziękujemy! Myślę, że powinno to być: if (req.query.param) { queryBuilder.where ('somecolumn', req.query.param); } –

+0

To zadziałało dla mnie. Dziękuję bardzo! –

+0

Mały błąd w tym kodzie. Powinno to być 'queryBuilder.where' zamiast' where' –