Contenido del curso
Database
- 3

Instalación de Docker en Windows, macOS y Ubuntu
01:35 min - 4

Configuración de Postgres en Docker Compose
09:18 min - 5

Conexión a Postgres en Docker: Terminal y PgAdmin
15:16 min - 6

Conexión de NestJS a Postgres con Node Postgres
07:28 min - 7

Inyección de Dependencias en NETJS: Conexión a PostgreSQL
10:49 min - 8

Conexión a Bases de Datos con Variables de Entorno en Node.js
13:49 min
TypeORM
- 9

Implementación de TypeORM con NestJS en Proyectos Node.js
09:14 min - 10

Creación de Entidades en ORM para Tiendas Virtuales
07:46 min - 11

Implementación del Patrón Repository en NestJS con TypeORM
13:31 min - 12

Operaciones CRUD en ProductService usando TypeORM y Postgres
13:35 min - 13

Cambio de Postgres a MySQL en Docker para CRUD de Productos
17:28 min
Migraciones
Relaciones
- 18

Relaciones 1 a 1 en Bases de Datos con TimeORM
18:58 min - 19

Manipulación de Relaciones Uno a Uno en Controladores y Servicios
10:28 min - 20

Relaciones Uno a Muchos en Bases de Datos con TypeORM
10:36 min - 21

Gestión de Relaciones Uno a Muchos en Controladores de API
10:27 min - 22

Relaciones Muchos a Muchos en Time1M: Creación y Manejo Práctico
08:38 min - 23

Manipulación de Relaciones Muchos a Muchos en Controladores
15:08 min - 24

Manipulación de Relaciones Muchos a Muchos con TimeORM en JavaScript
19:08 min - 25

Relaciones Muchos a Muchos con Campos Agregados en TimeWareM
16:40 min - 26

CRUD de órdenes de compra y gestión de ítems en NestJS
30:07 min
Consultas
- 27

Paginación de Productos con Limit y Offset en Controladores API
10:37 min - 28

Filtrado de Precios con Rango Usando Between en Time Wareham
Viendo ahora - 29

Indexación de Parámetros en Bases de Datos: Uso y Precauciones
02:54 min - 30

Buenas prácticas de nombramiento en JavaScript y bases de datos
17:52 min - 31

Serialización y Transformación de Datos en APIs con ClassTransformer
16:55 min
Migración a NestJS 9 y TypeORM 0.3
Próximos pasos
Filtrado de Precios con Rango Usando Between en Time Wareham
Resumen
Cuando necesitas filtrar productos dentro de un rango de precios específico, TypeORM ofrece operadores avanzados que simplifican esta tarea de forma elegante. Aprender a utilizar el operador Between y a construir condiciones dinámicas en tus consultas es fundamental para crear APIs robustas y flexibles.
¿Cómo funcionan las opciones avanzadas de búsqueda en TypeORM?
TypeORM proporciona dos niveles de búsqueda en sus repositorios. El nivel básico permite usar la cláusula where para filtrar por condiciones simples. Sin embargo, la parte avanzada incluye operadores SQL como Not, MoreThan, LessThan, MoreThanOrEqual y, el protagonista aquí, Between [01:10].
El operador Between permite definir un rango con un valor mínimo y un valor máximo. TypeORM traduce esto directamente a una sentencia SQL BETWEEN, lo que resulta ideal para filtrar precios, fechas o cualquier campo numérico.
¿Cómo configurar los DTOs para recibir un rango de precios?
El primer paso es agregar dos nuevos parámetros al DTO de filtros: minPrice y maxPrice [01:48]. Ambos se definen como positivos usando el decorador IsPositive() de class-validator, lo que impide enviar valores como cero o negativos.
¿Qué es ValidateIf y cómo garantiza que ambos valores lleguen juntos?
Una situación común es que si el usuario envía un precio mínimo, obligatoriamente debe enviar también el precio máximo para que el rango tenga sentido. Para esto se utiliza el decorador @ValidateIf() de class-validator [02:30]:
typescript @ValidateIf((item) => item.minPrice) @IsPositive() maxPrice: number;
Este decorador recibe una función que evalúa los atributos del DTO. En este caso, indica que maxPrice solo será validado (y por tanto requerido) cuando minPrice esté presente. Si no se envía minPrice, maxPrice tampoco será obligatorio.
¿Cómo construir un where dinámico en el servicio?
En lugar de tener un where fijo, la mejor práctica es construirlo de forma dinámica [03:30]. Esto permite agregar condiciones según los filtros que lleguen, ya sea por precio, marca, categoría u otro atributo:
typescript import { Between, FindOptionsWhere } from 'typeorm';
const where: FindOptionsWhere<Product> = {};
if (minPrice && maxPrice) { where.price = Between(minPrice, maxPrice); }
return this.productRepository.find({ where });
El tipo FindOptionsWhere (referido en la clase como FindConditions) permite tipar correctamente el objeto where con base en los atributos de la entidad Product [04:00]. Gracias a este tipado, al escribir where. el autocompletado mostrará únicamente las propiedades válidas del producto, lo que reduce errores.
Si ningún filtro está presente, el objeto where se envía vacío y la consulta retorna todos los registros sin restricciones.
¿Cómo probar el filtrado por rango en la práctica?
Al realizar pruebas con un cliente HTTP como Insomnia, se puede verificar el comportamiento del filtro [05:18]:
- Enviar solo minPrice sin maxPrice: la validación con
@ValidateIf()impide la petición y devuelve un error indicando quemaxPricees obligatorio. - Enviar minPrice=1 y maxPrice=20: retorna todos los productos con precio entre 1 y 20.
- Enviar minPrice=0: el decorador
@IsPositive()rechaza la petición porque cero no es un número positivo [06:10]. - Enviar minPrice=200 y maxPrice=250: retorna únicamente los productos dentro de ese rango específico [07:20].
Estos resultados confirman que tanto las validaciones del DTO como el operador Between funcionan correctamente en conjunto.
Para depuración, se puede agregar un console.log que muestre los valores de minPrice y maxPrice tal como llegan al servicio, lo cual ayuda a identificar problemas rápidamente [07:40].
TypeORM ofrece muchos más operadores avanzados además de Between, como In, Like, IsNull o Raw. Te invito a revisar la documentación oficial y experimentar con diferentes combinaciones para construir filtros cada vez más potentes en tus APIs. ¿Qué otros operadores te parecen útiles para tus proyectos?