Как написать функцию генераций запроса sql для получения данных с определенными критериями?
Таблица mysql:
id, category_id, name, bestseller, novelty, discount
С фронта мне приходит get запрос с параметрами, например
{
categories: [1,2],
bestseller: true,
discount: true,
novelty: '',
page: 1
}
Для отсеивания пустых ключей использую данный код:
const sortOptions = {};
Object.keys(data).forEach((key) => {
if (data[key] !== '') {
sortOptions[key] = data[key];
}
});
Моя задача заключается в том, чтобы сгенерировать sql запрос из полученных данных, а так же получить кол-во записей для пагинаций.
Сейчас я вижу для себя писать условия для каждого из возможных вариантов событий.
let sql = '', countSql = '', conditionPromo = '';
if (sortOptions.bestseller &&
sortOptions.novelty &&
sortOptions.discount) {
conditionPromo = 'bestseller = 1 OR novelty = 1 OR discount = 1';
} else if (...) {...} // И таких условий множество
const condition = `${
sortOptions.categories ? 'category_id IN (:categories)' : ''
} ${conditionPromo.trim() !== '' ? `AND ${conditionPromo}` : '' }`;
sql = `SELECT * FROM goods WHERE `id` > :id ${conditions.trim() !== '' ? `AND ${conditions}` : ''}`;
countSql = `SELECT COUNT(*) as count FROM goods ${conditions.trim() !== '' ? `WHERE ${conditions}` : ''}`;
К тому же я считаю свое решение не на 100%, ведь данные могут приходить по разному и допустим где-то 'AND' будет лишним к примеру. Подскажите стоит мне продумывать сейчас все возможные события или можно решить задачу намного проще?
Ответы (1 шт):
(без синтаксиса)
Сразу делаешь
sql = "SELECT * FROM goods WHERE 1=1";
а потом , если какой-то параметр фильтра задан - конкатенируешь его в запрос в правильной форме и с корректным квотированием, если требуется, и не забывая про разделительный пробел:
if (discount <> '') {
sql += " AND discount=" + discount;
}