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

Resolviendo la relación uno a uno en el controlador

19/36
Recursos

Aportes 5

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Cambiando el dto user

// src/users/dtos/user.dto
export class CreateUserDto {
  ...

	// Agregamos atributo
  @IsOptional()
  @IsNotEmpty()
  @ApiProperty() 
  readonly customerId: number; 
}

export class UpdateUserDto extends PartialType(CreateUserDto) {}

Modificando la funcion crear

Si el objeto contiene un customerId traemos los datos usando el servicio de customer

//src/users/services/user.service

async create(data: CreateUserDto) {
    const newUser = this.userRepo.create(data);
    if(data.customerId){
      const customer = await this.customerService.findOne(data.customerId);
      newUser.customer = customer;
    }
    return await this.userRepo.save(newUser);
  }

Modificando la funcion find

Si queremos que cuando se consulte al usuario tambien se obtengan los datos del customer debemos agregar la siguiente opcion

async findAll() {
    return await this.userRepo.find({
      relations: ['customer'] // esta
    });
  }

async findOne(id: number) {
  const user = await this.userRepo.findOne(id, {
    relations: ['customer'] // esta
  });
    
	if (!user) {
	    throw new NotFoundException(`User #${id} not found`);
	 }
   return user;
}

Resolviendo la relación uno a uno en el controlador

Vamos a resolver que al momento de crear un usuario, podamos mandar un id de un customer y así mismo crear la relación, pero para esto primero debemos modificar el DTO de creación de usuario:

  • src/users/dtos/user.dto:
// ...

export class CreateUserDto {
  // ..

	// simplemente especificamos que existe esta propiedad
	// anadimos validaciones
  @IsPositive()
  @IsOptional()
  @ApiProperty()
  readonly customerId: number;
}

export class UpdateUserDto extends PartialType(CreateUserDto) {}

Ahora si, vamos a modificar nuestro servicio de usuarios y vamos a preguntar si existe un customerId, y si sí, resolvamos la relación:

  • **src/users/services/user.service**:
// ...

import { User } from '../entities/user.entity';
import { CreateUserDto, UpdateUserDto } from '../dtos/user.dto';

import { ProductsService } from './../../products/services/products.service';
// importamos el servicio de Customers
import { CustomersService } from './customers.service';

@Injectable()
export class UsersService {
  constructor(
    // inyectamos el servicio de customers en nuestro servicio
    private customersService: CustomersService,
    @InjectRepository(User) private userRepo: Repository<User>,
  ) {}

  findAll() {
		// al momento de traer los usuarios, traemos su customer en caso de tenerlo
    return this.userRepo.find({
      where: { id },
      relations: ['customer'],
    });
  }

  async findOne(id: number) {
    // al momento de traer un usuario, traemos su customer en caso de tenerlo
    const user = await this.userRepo.findOne({
      where: { id },
      relations: ['customer'],
    });
    if (!user) {
      throw new NotFoundException(`Users #${id} not found`);
    }
    return user;
  }

  async create(data: CreateUserDto) {
    const newUser = this.userRepo.create(data);
    // si existe un customer el la data que nos envían
    if (data.customerId) {
      // encuentra a ese customer en base a su id
      const customer = await this.customersService.findOne(data.customerId);
      // relaciona al usuario con el customer
      newUser.customer = customer;
    }
    return this.userRepo.save(newUser);
  }

  // ...
}

Y listo, ya hemos resuelto la relación entre user y customer.

El nombre de esta clase debe ser “Resolviendo la relación uno a uno en el SERVICIO” pues al final es ahí donde mandamos la instrucción de las relaciones.

FindOne

Resolver relacion en el metodo findOne

    const product = await this.userRepository.findOne({
      where: { id },
      relations: ['customer'],
    });

Para obtener un usuario con su customer, en el método findOne, pueden hacer el siguiente cambio:

 async findOne(id: number) {
    const user = await this.userRepo.findOne(id, { relations: ['customer'] });
    if (!user) {
      throw new NotFoundException(`User #${id} not found`);
    }
    return user;
  }