Class 05: Quan hệ trong Database (OneToMany, ManyToOne) với TypeORM
Trong thực tế, dữ liệu thường có mối quan hệ với nhau, ví dụ như một người dùng có nhiều bài viết. TypeORM cung cấp cú pháp rõ ràng để định nghĩa các mối quan hệ như OneToMany, ManyToOne, OneToOne, và ManyToMany.
Thiết lập quan hệ giữa bảng: user – post
Giả sử chúng ta có hai bảng:
User: người dùngPost: bài viết (mỗi bài viết thuộc về một người dùng)
Entity User
// users/entities/user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Post } from '../../posts/entities/post.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Post, post => post.user, { cascade: true })
posts: Post[];
}Entity Post
Giải thích cú pháp
@OneToMany(() => Post, post => post.user): một người dùng có nhiều bài viết@ManyToOne(() => User, user => user.posts): một bài viết thuộc về một người dùng{ cascade: true }: khi tạouser, các bài viết có thể tự động lưu{ eager: true }: khi truy vấnpost, tự động lấy thông tinuser
Cascade và Eager Loading
Cascade
Cascade cho phép lưu/sửa/xoá dữ liệu liên quan tự động. Ví dụ:
Lưu ý: Cần khai báo
cascade: truetrong@OneToMany.
Eager Loading
Eager loading tự động load quan hệ mà không cần join. Ví dụ:
Lưu ý: Nếu không muốn dùng eager, bạn có thể dùng
leftJoinAndSelectthủ công.
Repository query nâng cao
Nếu không dùng eager, bạn có thể truy vấn quan hệ bằng QueryBuilder hoặc find với relations.
Cách 1: dùng relations trong find
relations trong findCách 2: dùng QueryBuilder
QueryBuilderThực hành: API lấy user kèm danh sách bài viết
Mục tiêu
Tạo hệ thống NestJS có 2 module: users và posts với quan hệ OneToMany – ManyToOne.
Yêu cầu
Tạo
UservàPostentity như hướng dẫn trênTạo
UsersServicevới hàmfindAllUsersWithPosts()Controller có endpoint:
GET /usersđể lấy user cùng bài viếtDùng quan hệ
relationshoặcjoinđể trả về đúng cấu trúc
Gợi ý controller
Gợi ý service
Output mong muốn
Bài tập thực hành
Mục tiêu
Tự tay cài đặt mối quan hệ User - Post, tạo dữ liệu giả và truy xuất.
Yêu cầu bài tập
Tạo bảng
UservàPostvới quan hệSử dụng
Postmanđể thêm dữ liệu:Tạo user
Gán nhiều bài viết cho user
Viết route:
GET /users: trả về user và danh sách bài viếtGET /posts: trả về bài viết và user đi kèm
Dùng cả
relationsvàQueryBuilderđể thực hành truy vấn
Kết luận
Qua bài học này, bạn đã học cách:
Định nghĩa quan hệ OneToMany – ManyToOne trong TypeORM
Sử dụng
cascadeđể lưu dữ liệu liên kếtDùng
eagerđể tự động load quan hệTruy vấn dữ liệu liên kết bằng
relationshoặcQueryBuilder
Kỹ năng này rất quan trọng khi bạn xây dựng hệ thống có quan hệ phức tạp, chẳng hạn như blog, diễn đàn, hệ thống thương mại điện tử…
Last updated