Relaciones uno a muchos con TypeORM en NestJS
Clase 18 de 35 • Curso de Backend con NestJS
Resumen
Cuando buscamos crear proyectos sólidos en NestJS utilizando bases de datos relacionales como PostgreSQL, comprender las relaciones uno a muchos es esencial. Esta relación permite que una entidad (como User) tenga múltiples elementos relacionados (como Post), y asegura integridad y organización en los datos. Aquí veremos cómo puedes implementar relaciones uno a muchos utilizando TypeORM y algunos consejos prácticos.
¿Cómo se implementa una relación uno a muchos en bases de datos con TypeORM?
En el modelo presentado, un usuario puede tener varios posts, y cada post pertenece a un solo usuario. Es una de las convenciones más comunes en bases de datos transaccionales. - En TypeORM, se utiliza el decorador ManyToOne en la entidad hija (Post) para indicar la relación hacia la entidad principal (User). - Al mismo tiempo, el decorador OneToMany en la entidad principal permite consultar los posts desde el usuario. - La relación es bidireccional, lo que significa que puedes acceder a los posts desde el usuario (user.posts) y saber a qué usuario pertenece un post (post.user).
Ejemplo de código simplificado:
// En la entidad Post:
@ManyToOne(() => User, user => user.posts)
@JoinColumn({ name: 'user_id' })
user: User;
// En la entidad User:
@OneToMany(() => Post, post => post.user)
posts: Post[];
Además, el uso de JoinColumn en la entidad hija se considera una buena práctica para definir el nombre de la columna de la llave foránea, normalmente como "user_id".
¿Cuáles son las mejores prácticas para asegurar integridad en las relaciones uno a muchos?
- Definir la columna como no nula: El campo user_id debe tener la opción
nullable: false
para obligar que cada artículo siempre pertenezca a un usuario. - Actualizar el DTO (Data Transfer Object): Al crear un post, el user_id se vuelve obligatorio en la API y debe validarse como tipo numérico y no puede estar vacío.
- Sincronización automática: Al activar la opción Synchronize en TypeORM, los cambios en las entidades se reflejan automáticamente en la base de datos durante el desarrollo. Sin embargo, se recomienda usar métodos más seguros en producción.
¿Cómo se consultan artículos junto con la información del usuario y su perfil?
Obtener datos anidados es común en aplicaciones modernas, donde se espera ver el artículo, su autor y el perfil del usuario. - Utilizando el método findOne con relaciones: Al crear un post, se recomienda utilizar el método findOne e incluir las relaciones user
y user.profile
para retornar detalles anidados del usuario y su perfil. - Listar artículos con autor: Al obtener todos los posts usando el método find, también deben incluirse las relaciones con user y profile, para que cada artículo incluya el nombre, avatar, y otros datos relevantes del autor, como ocurre en plataformas tipo dev.to. - Ejemplo de consulta:
const post = await postRepository.findOne({
where: { id: postId },
relations: ['user', 'user.profile']
});
const posts = await postRepository.find({
relations: ['user', 'user.profile']
});
Esto facilita renderizar la información completa en tu aplicación web o móvil, mostrando artículos junto al nombre y avatar de quien los creó.
¿Qué ajustes se deben realizar en la creación de publicaciones y validaciones?
- Asegurar consistencia en los nombres de los atributos: Aunque en la base de datos el campo se guarde como user_id, a nivel de TypeORM la propiedad es simplemente
user
, así debes enviarla al crear registros. - Validar al crear artículos: Es obligatorio que el usuario esté especificado y exista, por lo que se debe verificar en la lógica del servicio y ajustar el DTO.
- Propuesta de endpoint extra: Se sugiere crear un Endpoint para retornar todos los posts de un usuario específico, usando su ID para filtrar los artículos relacionados.
La integración de estas relaciones y la consulta adecuada mejora la experiencia al mostrar, por ejemplo, listados de artículos acompañados de la información de sus autores. ¿Quieres ver más ejemplos prácticos de cómo gestionar relaciones en tus proyectos? Escribe tus preguntas y comparte tu experiencia.