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

#javascript #sql #query-builder #typeorm

#javascript #sql #конструктор запросов #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 ?

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

Ответ №1:

После более тщательного тестирования мне удалось придумать способ сделать это динамически, сохранив экземпляр конструктора запросов Select, а затем добавив .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();