TypeOrm:选择包含数组中所有值的结果
TypeOrm: Selecting results that contain all values in array
我在从 Typeorm 查询中获取我想要的数据时遇到了一些问题。
基本上,我们有一个搜索栏供用户搜索我们的产品(药物)数据库。我想 select 数据库中包含用户输入的每个单词的所有记录。 (这些词被分成一组值。)它可能与产品名称不完全匹配,所以我想我应该使用 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
,我该怎么做?
非常感谢您的宝贵时间。
经过更多测试后,我想出了一种动态执行此操作的方法,方法是保存 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();
我在从 Typeorm 查询中获取我想要的数据时遇到了一些问题。
基本上,我们有一个搜索栏供用户搜索我们的产品(药物)数据库。我想 select 数据库中包含用户输入的每个单词的所有记录。 (这些词被分成一组值。)它可能与产品名称不完全匹配,所以我想我应该使用 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
,我该怎么做?
非常感谢您的宝贵时间。
经过更多测试后,我想出了一种动态执行此操作的方法,方法是保存 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();