El .findByIds esta deprecated por lo cual se debe usar
import { In } from 'typeorm';
this.categoryRepo.findBy({id: In([1, 2, 3, 4])})
Introducción
¿Ya terminaste el Curso de NestJS: Programación Modular?
Platzi Store: presentación del proyecto e instalación
Database
Cómo instalar Docker para este proyecto
Configuración de PostgresSQL en Docker
Explorando postgres con interfaces gráficas y terminal
Integración de node-postgres con NestJS
Conexión como inyectable y ejecutando un SELECT
Usando variables de ambiente
TypeORM
¿Qué es un ORM? Instalando y configurando TypeORM Module
Creando tu primera entidad
TypeORM: active record vs. repositories
Crear, actualizar y eliminar
Cambiar a Mysql demo (opcional)
Migraciones
Sync Mode vs. Migraciones en TypeORM
Configurando migraciones y npm scripts
Corriendo migraciones
Modificando una entidad
Relaciones
Relaciones uno a uno
Resolviendo la relación uno a uno en el controlador
Relaciones uno a muchos
Resolviendo la relación uno a muchos en el controlador
Relaciones muchos a muchos
Resolviendo la relación muchos a muchos en el controlador
Manipulación de arreglos en relaciones muchos a muchos
Relaciones muchos a muchos personalizadas
Resolviendo la relación muchos a muchos personalizada en el controlador
Consultas
Paginación
Filtrando precios con operadores
Agregando indexadores
Modificando el naming
Serializar
Migración a NestJS 9 y TypeORM 0.3
Actualizando Dependencias para NestJS 9
Cambios en TypeORM 0.3
Migraciones en TypeORM 0.3
Próximos pasos
Cómo solucionar una referencia circular entre módulos
Continúa con el Curso de NestJS: Autenticación con Passport y JWT
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Nicolas Molina
Aportes 9
Preguntas 2
El .findByIds esta deprecated por lo cual se debe usar
import { In } from 'typeorm';
this.categoryRepo.findBy({id: In([1, 2, 3, 4])})
Buenas la forma correcta de revisar categoriesId en el dto es
@ApiProperty()
@IsArray()
@ArrayMinSize(1)
@IsNumber({}, { each: true })
readonly categoriesId: number[];
De esta manera te revisa que tenga al menos 1 elemento el arrray y que los elementos sean numbers
modificamos el dto
import {
IsString,
IsNumber,
IsUrl,
IsNotEmpty,
IsPositive,
IsArray,
} from 'class-validator';
import { PartialType, ApiProperty } from '@nestjs/swagger';
export class CreateProductDto {
...
// Agregamos este campo
@IsArray()
@IsNotEmpty()
@ApiProperty()
readonly categoriesIds: number[];
}
export class UpdateProductDto extends PartialType(CreateProductDto) {}
Modificaremos el metodo para crear un producto
// src\products\services\products.service.ts
async create(data: CreateProductDto) {
const newProduct = this.productRepo.create(data);
if (data.brandId) {
const brand = await this.brandRepo.findOne(data.brandId);
newProduct.brand = brand;
}
// Aqui resolvemos la categoria
if (data.categoriesIds) {
const categories = await this.categoryRepo.findByIds(data.categoriesIds);
newProduct.categories = categories
}
return this.productRepo.save(newProduct);
}
// src\products\services\products.service.ts
async findOne(id: number) {
const product = await this.productRepo.findOne(id,{
relations: ['brand', 'categories']
});
if (!product) {
throw new NotFoundException(`Product #${id} not found`);
}
return product;
}
// src\products\services\categories.service.ts
async findOne(id: number) {
const category = await this.categoryRepo.findOne(id,{
relations: ['products']
});
if (!category) {
throw new NotFoundException(`Category #${id} not found`);
}
return category;
}
Según este pedazo de clean code para JS; la mejor manera para hacer la parte de la consulta sin relaciones es como lo muestra Nico; pero según este pedazo, que habla sobre SOLID, es mejor tratar de dejar el servicio de productos sin inyecciones externas de código (Es decir, el repositorio); por lo que pienso que la mejor aproximación sería usar un método en el servicio Brand
Lo logré de esta forma:
const categories = await this.categoryRepository.find({
where: data.categoriesIds.map((categoryId) => ({ id: categoryId })),
});
Ya que al pasar un array en el where le estás diciendo que utilice el operador or, así no tenemos por qué importar “In” de typeorm y además podemos controlar de mejor forma la consulta.
Este cambio de código:
async findOne(id: number) {
const category = await this.categoryRepo.findOne(id, {
relations: ['products'],
});
if (!category) {
throw new NotFoundException(`Category #${id} not found`);
}
return category;
}
Lo hicimos en el SERVICIO, no en el controlador, la clase debería cambiar su título.
lo pueden hacer de esta manera TypeORM ha cambiado cositas
this.categoryRepo.findOne({
where: { id },
relations: [‘products’],
})
En caso tal estén haciendo cambios y no los vean reflejados al hacer las peticiones, deben hacer build npm run build
y luego volver a correr el proyecto. Otra solución es eliminar la carpeta dist y volver a correr el proyecto.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?