Как написать запрос на языке SQL с использованием библиотеки Knex?

Как переписать данную SQL-запрос с использованием Knex, заменив ['обработка', 'выкуплено'] на filters.statuses.ids? Мой текущий подход в Knex не работает, вот что я пробовал:

```javascript
this.whereRaw("c.leads->'countries'->'ids' ?|", filters.countries.ids)
```

Можете помочь мне с этим, пожалуйста?
  • 16 января 2024 г. 8:08
Ответы на вопрос 1
Knex.js является билдером запросов для SQL, который позволяет писать запросы с использованием более читабельного и безопасного JavaScript синтаксиса, который затем транслируется в сырой SQL для выполнения запросов к базе данных. Если у вас есть задача перевести SQL запрос с использованием массива `['обработка', 'выкуплено']` в knex-запрос с заменой на `filters.statuses.ids`, вы можете сделать это следующим образом:

Допустим у нас есть SQL запрос типа:
```sql
SELECT * FROM table WHERE table.column && ARRAY['обработка', 'выкуплено'];
```

И мы хотим использовать `filters.statuses.ids` вместо `ARRAY['обработка', 'выкуплено']`, запрос в Knex мог бы выглядеть так:

```javascript
const filters = {
  statuses: {
    ids: ['обработка', 'выкуплено']
  }
  // предполагаем, что filters может содержать и другие поля для фильтрации
};

knex('table') // указываем таблицу для запроса
  .select('*') // выбираем все колонки
  .whereRaw('table.column && ?', [filters.statuses.ids]) // используем whereRaw для сырого условия и передачи массива
  .then(rows => {
    // здесь у вас будет результат в rows
    console.log(rows);
  })
  .catch(error => {
    // обработка ошибки
    console.error(error);
  });
```

Если ваша цель проверить, что JSONB-колонка `leads` в подполе `countries` в подполе `ids` содержит хотя бы один из элементов, перечисленных в `filters.countries.ids`, то запрос в Knex может выглядеть так:

```javascript
knex('table_name') // замените table_name на имя вашей таблицы
  .whereRaw('?| array(select jsonb_array_elements_text((c.leads->\'countries\')->\'ids\'))', [filters.countries.ids])
  .then(/* ваш код для обработки результата */)
  .catch(/* ваш код для обработки ошибки */);
```

Убедитесь, что переменная `filters.countries.ids` действительно представляет обычный JavaScript-массив со значениями, которые необходимы для фильтрации.

Обратите внимание, что использование метода `whereRaw` может увеличить риск SQL-инъекций, если данные, передаваемые в запрос, не санитизированы.<tbody></tbody> Knex предоставляет параметризованные запросы (как в примере выше с `?`), чтобы минимизировать этот риск. Убедитесь, что все данные, поступающие от пользователя или из внешних источников, тщательно проверяются и очищаются.
Похожие вопросы