Necesito escribir un código TypeORM para generar una consulta que seleccione a todos los clientes que realizaron una compra pero no iniciaron una devolución. Esta es la estructura de la base de datos:
Clientela:
Compras:
Devoluciones:
Esto es lo que uso para obtener todos los clientes, sus compras y devoluciones. Esto funciona:
let query = this.clientRepo .createQueryBuilder('client') .select() .leftJoinAndSelect('client.purchase', 'purchase') .leftJoinAndSelect('purchase.returns', 'returns');Ahora, estoy tratando de agregar un filtro para ver solo a los clientes que iniciaron una devolución. Esto es lo que probé y los errores que obtuve:
query = query.where('purchase.returns IS NULL');(Error: QueryFailedError: Error: Nombre de columna no válido 'devoluciones').
query = query.where('client.purchase IS NOT NULL and purchase.returns IS NULL');(Error: no se puede consultar de uno a varios para obtener devoluciones de propiedades)
query = query.where('purchase.returns IS (:...returnValues)', {returnValues: []});(Error: QueryFailedError: Error: Uso no válido de la opción NEXT en la instrucción FETCH).
Soy nuevo en TypeORM. ¿Cómo resolver este problema? ¡Muchas gracias por adelantado!
Bien, encontré una respuesta. Si alguien lo necesita para el futuro:
query = query.where('client.purchase IS NOT NULL AND returns.Id IS NULL'); La razón por la que escribe "devoluciones.Id", pero no "compra.Id" es que "compra" es un alias que ya hace referencia a la columna Id. Y una columna puede ser nula o no nula.
A diferencia de la compra, el alias "devoluciones" se refiere a una tabla, no a una columna. Una tabla no puede ser nula o no nula, por lo que debe obtener una columna, como "Id".
Por lo que entiendo, esta diferencia en las referencias proviene de que la relación cliente->compra es de uno a uno, pero la compra->devoluciones es de muchos a uno