Как выполнять параметр поиска по условию? typeorm (queryBuilder)
Есть запрос на получение данных из БД постгрес:
const uni = await this.contactInfoRepo
.createQueryBuilder('contact_info')
.leftJoinAndSelect('contact_info.university', 'university')
.leftJoinAndSelect('contact_info.country', 'country')
.leftJoinAndSelect('contact_info.region', 'region')
.leftJoinAndSelect('contact_info.city', 'city')
.leftJoinAndSelect('university.directions', 'directions')
.leftJoinAndSelect('directions.admissionInfo', 'admissionInfo')
.leftJoinAndSelect('directions.info', 'info')
.leftJoinAndSelect('university.prices', 'prices')
.leftJoinAndSelect('university.structureUniversity', 'structureUniversity')
.orderBy(`university.${field}`, `${type}`)
.where('university.status = true')
.where("country.id = :id", { id: country }) //1
.where("region.id = :id", { id: region }) //23
.where("city.id = :id", { id: city }) //38
.skip(skip)
.take(take)
.getMany()
При указании country/region/city все работает, но если хоть 1 параметр передать как 0 или null запрос ничего не выводит, в то время как аналогичный запрос но на .find отлично работает, в чем дело? как сделать region и city не обязательными!!!!
Аналогичный пример с .find (рабочий)
const total = await this.contactInfoRepo.find({
relations: [...],
where: {
country: {
id: country
},
region: {
id: region
},
city: {
id: city
},
university: {
status: true
},
},
})
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
Сделайте так:
const qb = this.contactInfoRepo.createQueryBuilder('contact_info');
qb.where('university.status = true')
.leftJoinAndSelect('contact_info.university', 'university')
.leftJoinAndSelect('contact_info.country', 'country')
.leftJoinAndSelect('contact_info.region', 'region')
.leftJoinAndSelect('contact_info.city', 'city')
.leftJoinAndSelect('university.directions', 'directions')
.leftJoinAndSelect('directions.admissionInfo', 'admissionInfo')
.leftJoinAndSelect('directions.info', 'info')
.leftJoinAndSelect('university.prices', 'prices')
.leftJoinAndSelect('university.structureUniversity', 'structureUniversity');
if (country) {
qb.andWhere("country.id = :country_id", { country_id: country });
}
if (region) {
qb.andWhere("region.id = :region_id", { region_id: region });
}
if (city) {
qb.andWhere("city.id = :city_id", { city_id: city });
}
if (type) {
qb.orderBy(`university.${field}`, `${type}`);
}
const uni = await qb.skip(skip).take(take).getMany();