Выборка по нескольким параметрам typeorm/nestjs (createQueryBuilder)
Делаю фильтрацию по стране/области/городу и столкнулся с проблемой, если использовать .find то все отлично, находится пересечение страны/области/города, даже если указать например город 0 (которого нет), то выборка происходит по стране и области и все супер
const total = await this.contactInfoRepo.find({
relations: [...],
where: {
country: {
id: country
},
region: {
id: region
},
city: {
id: city
},
university: {
status: true
},
},
})
Но мне необходимо повторить это с использованием .createQueryBuilde, вот как я его переписал
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')
.andWhere("country.id = :id", { id: country }) //1
.andWhere("region.id = :id", { id: region }) //0
.andWhere("city.id = :id", { id: city }) //0
.limit(take)
.offset(skip)
.getMany()
При такой реализации вся выборка ломается и не работает пересечение страны/области/города, подскажите как исправить и что для этого использовать? Можно ли выполнить это на find?
Вот контроллер где вызываю сервис и передаю параметры
return await this.universitiesService.getUniversities(
query.country > 0 ? query.country : null,
query.region > 0 ? query.region : null,
query.city > 0 ? query.city : null,
query.field ? query.field : 'id',
query.type,
query.take,
query.skip,
)
Ответы (1 шт):
Попробуйте вот так оформить запрос:
...
.leftJoinAndSelect('contact_info.university', 'university', 'university.status = true')
.leftJoinAndSelect('contact_info.country', 'country', 'county.id = :id', { id: country })
...
тоже самое для region и city.
И, соответственно, из запроса убрать
.where('university.status = true')
.andWhere("country.id = :id", { id: country }) //1
.andWhere("region.id = :id", { id: region }) //0
.andWhere("city.id = :id", { id: city }) //0

