Tengo dos entidades una es car y otra es carAvailability
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm'; import { CarAvailability } from 'src/car-availabilitys/car-availability.entity'; @Entity('cars') export class Car { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(() => CarAvailability, (carAvailability) => carAvailability.car, { eager: true, cascade: true, }) availabilities: CarAvailability[]; }Estoy tratando de agregar un servicio que consulta y filtra autos según la disponibilidad. En Mi Servicio e intenté de dos maneras:
Método 1 con funciones de repositorio:
async test () { const startDateTime = '2012-04-24 02:25:43.511'; return await this.repo.find({ relations: ['availabilities'], where: { availabilities: { start_date_time: startDateTime } } }); }Método 2 con el generador de consultas:
async test () { const startDateTime = '2012-04-24 02:25:43.511'; return this.repo.createQueryBuilder('cars') .innerJoin('cars.availabilities', 'car_availabilities') .where("cars.availabilities.start_date_time = :startDateTime", { startDateTime }) .getMany(); }Error del método 1:
Error: Cannot query across one-to-many for property availabilitiesError del método 2:
QueryFailedError: missing FROM-clause entry for table "availabilities"Siento que me estoy perdiendo algo, pero no estoy seguro. He referido documentos de NestJS y TypeORM, pero parece que no puedo entender qué salió mal.
Usando el Método 2, debido a que creó un alias de car.availabilities como car_availabilities , su cláusula where debe usar el nombre de alias:
car_availabilities.start_date_timeno:
cars.availabilities.start_date_timeUso de las funciones de repositorio del Método 1 con el generador de consultas anidadas:
async test () { const startDateTime = '2012-04-24 02:25:43.511'; return await this.repo.find({ relations: ['availabilities'], where: (qb) => { qb.where('availabilities.start_date_time = :startDateTime', { startDateTime }); } }); }Retire cascade del lado oneToMany y coloque:
{ cascade: true, onDelete: 'CASCADE', onUpdate:'CASCADE' } en el lado manyToOne .
Y si va a usar relaciones: ['availabilities'] puede eliminar eager: true .