2014-12-01 2 views
11

Desidero aggiungere una clausola where() nella mia query, ma condizionata. Nello specifico, voglio che venga aggiunto solo se un parametro querystring specifico viene passato nell'URL. È possibile, e se sì, come potrei fare?Posso aggiungere condizionatamente una clausola where() alla mia query 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); 
     }); 
}); 

risposta

5

È possibile memorizzare la query in una variabile, applicare la condizionale dove clausola e quindi eseguirlo, in questo modo:

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

È possibile farlo controllando se la stringa di query è presente e in esecuzione una query diversa.

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

Sì. Utilizzare modify.

applicata al tuo esempio:

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

Grazie! Penso che dovrebbe essere: if (req.query.param) { queryBuilder.where ('somecolumn', req.query.param); } –

+0

Questo ha funzionato per me. Grazie mille! –

+0

Piccolo bug in questo codice. Questo dovrebbe essere 'queryBuilder.where' invece di' where' –