Introducci贸n

1

驴Ya terminaste el Curso de NestJS: Programaci贸n Modular?

2

Platzi Store: presentaci贸n del proyecto e instalaci贸n

Database

3

C贸mo instalar Docker para este proyecto

4

Configuraci贸n de PostgresSQL en Docker

5

Explorando postgres con interfaces gr谩ficas y terminal

6

Integraci贸n de node-postgres con NestJS

7

Conexi贸n como inyectable y ejecutando un SELECT

8

Usando variables de ambiente

TypeORM

9

驴Qu茅 es un ORM? Instalando y configurando TypeORM Module

10

Creando tu primera entidad

11

TypeORM: active record vs. repositories

12

Crear, actualizar y eliminar

13

Cambiar a Mysql demo (opcional)

Migraciones

14

Sync Mode vs. Migraciones en TypeORM

15

Configurando migraciones y npm scripts

16

Corriendo migraciones

17

Modificando una entidad

Relaciones

18

Relaciones uno a uno

19

Resolviendo la relaci贸n uno a uno en el controlador

20

Relaciones uno a muchos

21

Resolviendo la relaci贸n uno a muchos en el controlador

22

Relaciones muchos a muchos

23

Resolviendo la relaci贸n muchos a muchos en el controlador

24

Manipulaci贸n de arreglos en relaciones muchos a muchos

25

Relaciones muchos a muchos personalizadas

26

Resolviendo la relaci贸n muchos a muchos personalizada en el controlador

Consultas

27

Paginaci贸n

28

Filtrando precios con operadores

29

Agregando indexadores

30

Modificando el naming

31

Serializar

Migraci贸n a NestJS 9 y TypeORM 0.3

32

Actualizando Dependencias para NestJS 9

33

Cambios en TypeORM 0.3

34

Migraciones en TypeORM 0.3

Pr贸ximos pasos

35

C贸mo solucionar una referencia circular entre m贸dulos

36

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

Compra acceso a todo Platzi por 1 a帽o

Antes: $249

Currency
$209/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscr铆bete

Termina en:

14D
5H
12M
22S

Resolviendo la relaci贸n muchos a muchos en el controlador

23/36
Recursos

Aportes 8

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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

Apuntes

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) {}

Create

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);
  }

Find

// 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;
  }

Find of categories

// 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 鈥淚n鈥 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: [鈥榩roducts鈥橾,
})

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.