У меня возникли проблемы с получением данных, которые я хочу, из запроса 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
?
Большое спасибо за ваше время.
Еще немного протестировав его, мне удалось найти способ сделать это динамически, сохранив экземпляр построителя запросов выбора, а затем добавив цепочки .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();