TypeOrm: выбор результатов, содержащих все значения в массиве

У меня возникли проблемы с получением данных, которые я хочу, из запроса Typeorm.

По сути, у нас есть панель поиска, с помощью которой пользователи могут искать нашу базу данных продуктов (лекарств). Я хочу выбрать все записи из базы данных, которые включают каждое введенное пользователем слово. (Эти слова разбиты на массив значений.) Возможно, это не идеальное совпадение с названием продукта, поэтому я думаю, что мне следует использовать LIKE?

В базе данных есть результаты на английском, японском и китайском языках. Я хочу найти английское имя (nameEn), японское имя (nameJa) и китайское имя (nameZh) для любых результатов, содержащих все поисковые запросы пользователя.

Я не уверен, как я могу программно перебирать поисковые запросы, а также одновременно создавать запрос для Typeorm.

Текущий код:

const medicines = await getRepository(Medicine)
  .createQueryBuilder('medicine')
  .where('medicine.nameEn like :query', { query: '%bufferin%' })
  .andWhere(
    new Brackets((qb) => {
      qb.where('medicine.nameEn like :query1', {
        query1: '%luna%',
      }).orWhere('medicine.nameEn like :query2', { query2: 'EX' });
    }),
  )
  .getMany();

Это работает для получения совпадающих английских продуктов... но сейчас я просто жестко запрограммировал запрос "bufferin luna EX". Как бы я это сделал, если бы это было ['bufferin', 'luna', 'EX'], а также хотел проверить nameJa и nameZh?

Большое спасибо за ваше время.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
2 359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Еще немного протестировав его, мне удалось найти способ сделать это динамически, сохранив экземпляр построителя запросов выбора, а затем добавив цепочки .andWhere для каждого запроса. Публикация кода на случай, если он поможет кому-то в будущем.

// get instance of Select Query Builder
let builder = await getRepository(Items)
  .createQueryBuilder('item')

// validating data
  .where('item.categoryId is not null')
  .andWhere('item.companyId is not null');
    

queries.map((query, index) => {
  const queryName = `query_${index}`;
  const escapedQuery = escapeLikeString(query);

  builder = builder   
  .andWhere(`item.nameEn like :${queryName}`, { [queryName]: `%${escapedQuery}%` })
  .orWhere(`item.nameJa like :${queryName}`, { [queryName]: `%${escapedQuery}%` })
  .orWhere(`item.nameZh like :${queryName}`, { [queryName]: `%${escapedQuery}%` })
});
    
  const items = await builder.getMany();

Другие вопросы по теме