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

我想在我的查询中添加一个where()子句,但是有条件的 。 具体而言,我希望它只有在URL中传递了特定的查询string参数时才添加。 这是可能的,如果是的话,我会怎么做呢?

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

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

你可以通过检查你的查询string是否存在并运行不同的查询来完成。

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