#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();