Я пытаюсь получить список пользователей, в котором пол, регион и статус являются обязательными фильтрами в моем приложении. Фильтрация работает нормально, когда пол равен 0 или 1. Проблема в том, что мне нужны оба. Сценарий одинаков для всех 3 фильтров.

API: https://website.com/api/getUsers?gender=0&region=1&status=1 для получения результатов фильтрации.

ПОДХОД 1. Я хочу передать кое-что для этих параметров API, например. гендер = # $%, чтобы он игнорировал предложение WHERE при передаче его в queryInputs ниже.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users` WHERE `gender` = ? AND `status` = ? AND `region` = ? LIMIT ? OFFSET ?';
var queryInputs = [parseInt(gender), parseInt(status), parseInt(region), 10, parseInt(offset)];

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}

ПОДХОД 2: я передаю пустые параметры для проверки, чтобы получить все данные для определенных фильтров, например. https://website.com/api/getUsers?gender=&region=1&status=

Я пытаюсь избежать предложения WHERE, если я передаю пустые параметры в api. Это почти сработало для меня, если бы в запросе не было последнего И перед LIMIT.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users`';
if( gender != '' || status!= '' || region != '') dbQuery += ' WHERE'
if(gender != ''){
    dbQuery += ' `gender` = '+ db.escape(parseInt(gender))+' AND';
}
if(status != ''){
    dbQuery += ' `status` = '+ db.escape(parseInt(status))+' AND';
}
if(region != ''){
    dbQuery += ' `region` = '+ db.escape(parseInt(region))+' AND';
}
dbQuery += ' LIMIT 10 OFFSET ' + db.escape(parseInt(offset));

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}

Среди этих двух подходов решение для всех работает для меня.

1
VipiN Negi 6 Авг 2020 в 23:26

2 ответа

Лучший ответ

Вот редактирование вашего второго подхода. Это должно позволить вам поставить «И» перед добавлением запроса, чтобы избежать указанной ошибки.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users` WHERE 1=1 ';
//if( gender != '' || status!= '' || region != '') dbQuery += ' WHERE'
if(gender != ''){
    dbQuery += 'AND `gender` = '+ db.escape(parseInt(gender));
}
if(status != ''){
    dbQuery += 'AND `status` = '+ db.escape(parseInt(status));
}
if(region != ''){
    dbQuery += 'AND `region` = '+ db.escape(parseInt(region));
}
dbQuery += ' LIMIT 10 OFFSET ' + db.escape(parseInt(offset));

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}
1
Captain 6 Авг 2020 в 20:38

В соответствии с лучшими практиками, если вы хотите получить всех пользователей, вы можете следовать подходу, приведенному ниже:

1: Создайте новый API (/ allUsers) с разбивкой на страницы, очевидно, и создайте отдельный оператор SQL для этого API, где вам не нужно добавлять предложение фильтра.

Или

2: Добавьте проверку валидации в существующий API, если нет параметра, тогда не применяйте фильтры, иначе примените как обычно.

0
Harsh Srivastava 6 Авг 2020 в 20:33