Trong kiến trúc NestJS kết hợp với TypeORM, Repository là lớp trung gian giúp bạn thực hiện các thao tác đọc ghi dữ liệu xuống cơ sở dữ liệu mà không cần phải viết các câu lệnh SQL thuần túy. Tài liệu này tổng hợp toàn bộ các phương thức (methods) quan trọng nhất của
Repository lớp trong TypeORM, phân loại mục đích sử dụng và hướng dẫn cách ra lệnh cho Claude Code lựa chọn phương thức tối ưu nhất cho từng bài toán cụ thể.
Phân loại các Phương thức trong Repository
TypeORM chia các phương thức tương tác dữ liệu thành 4 nhóm chính: Khởi tạo, Truy vấn, Cập nhật và Xóa.1. Nhóm Phương thức Khởi tạo (Creation)
Các phương thức giúp tạo mới thực thể trong ứng dụng trước khi lưu xuống cơ sở dữ liệu.create()
- Ý nghĩa: Khởi tạo một đối tượng thực thể (instance) mới từ dữ liệu truyền vào.
- Đặc điểm: Không thực hiện bất kỳ câu lệnh SQL nào và không lưu vào Database. Nó chỉ đơn thuần là tạo ra một đối tượng Javascript có kiểu là lớp thực thể đó để chuẩn bị lưu.
- Cú pháp:
2. Nhóm Phương thức Truy vấn (Finding)
Giúp đọc dữ liệu từ Database lên bộ nhớ ứng dụng.| Tên Phương thức | Ý nghĩa | Ví dụ thực tế |
|---|---|---|
find() | Lấy danh sách các bản ghi thỏa mãn điều kiện lọc, sắp xếp, phân trang. | find({ where: { isAvailable: true }, order: { price: 'ASC' } }) |
findBy() | Phiên bản đơn giản hơn của find(), chỉ lọc nhanh bằng các thuộc tính trực tiếp. | findBy({ isAvailable: true }) |
findOne() | Lấy bản ghi đầu tiên thỏa mãn điều kiện. Trả về null nếu không thấy. | findOne({ where: { id: 1 } }) |
findOneBy() | Phiên bản đơn giản hơn của findOne(), tìm nhanh theo thuộc tính trực tiếp. | findOneBy({ id: 1 }) |
findOneOrFail() | Tìm bản ghi đầu tiên, nếu không thấy sẽ tự động ném lỗi (EntityNotFoundError). | findOneOrFail({ where: { sku: 'P001' } }) |
count() | Đếm tổng số bản ghi thỏa mãn điều kiện. | count({ where: { isAvailable: false } }) |
Ví dụ truy vấn nâng cao với điều kiện và nạp quan hệ (Relations):
3. Nhóm Phương thức Ghi & Cập nhật (Saving & Updating)
Có hai trường phái cập nhật dữ liệu trong TypeORM với các ưu nhược điểm riêng biệt mà lập trình viên cần phân biệt.- Trường phái 1: save() & merge()
- Trường phái 2: update() trực tiếp
save() được dùng cho cả việc tạo mới (INSERT) lẫn cập nhật (UPDATE). Nếu đối tượng truyền vào chưa có khóa chính, TypeORM sẽ tạo mới. Nếu đã có khóa chính, nó sẽ cập nhật bản ghi tương ứng.
- Quy trình cập nhật:
- Tìm thực thể cũ bằng
findOne(). - Dùng
merge()để gộp các thay đổi từ DTO vào thực thể cũ. - Chạy
save()để lưu.
- Tìm thực thể cũ bằng
- Ưu điểm: Tự động kích hoạt toàn bộ các hooks của thực thể (như
@BeforeUpdate(),@AfterUpdate()), kiểm soát dữ liệu chính xác. - Ví dụ:
4. Nhóm Phương thức Xóa (Deleting & Removing)
Tương tự như cập nhật, việc xóa cũng chia làm hai trường phái dựa trên hiệu năng và tính năng kích hoạt hooks.delete() vs remove()
delete(): Chạy trực tiếp lệnhDELETESQL trong DB dựa trên ID hoặc điều kiện truyền vào. Hiệu năng cực cao, không kích hoạt thực thể hooks.remove(): Nhận vào một thực thể cụ thể đã tải lên bộ nhớ và xóa thực thể đó. Kích hoạt toàn bộ thực thể hooks (như@BeforeRemove()), tốn tài nguyên hơn.
Xóa mềm (Soft Delete)
Đối với dữ liệu quan trọng, thay vì xóa vật lý khỏi ổ cứng, ta thường đánh dấu xóa mềm bằng cách điền ngày xóa vào cột@DeleteDateColumn().
softDelete(): Xóa mềm trực tiếp bằng ID không cần nạp thực thể.softRemove(): Xóa mềm thực thể đã nạp trên bộ nhớ (chạy hooks).restore(): Khôi phục lại bản ghi đã bị xóa mềm trước đó.