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
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: true
trong@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
leftJoinAndSelect
thủ 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 find
Cách 2: dùng QueryBuilder
QueryBuilder
Thự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
User
vàPost
entity như hướng dẫn trênTạo
UsersService
với hàmfindAllUsersWithPosts()
Controller có endpoint:
GET /users
để lấy user cùng bài viếtDùng quan hệ
relations
hoặ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
User
vàPost
vớ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ả
relations
và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
relations
hoặ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