0

"Bách khoa toàn thư" Eloquent ORM trong Laravel: Tổng hợp trọn bộ các phương pháp "thần thánh" từ cơ bản đến nâng cao

Chào anh em!

Nếu Laravel được ví là cỗ siêu xe đưa lập trình viên PHP đến đích nhanh nhất, thì Eloquent ORM chính là động cơ cốt lõi tạo nên sức mạnh đó. Thay vì phải viết những câu lệnh SQL dài dòng, thô kệch và dễ dính lỗi bảo mật, Eloquent biến mọi bảng trong cơ sở dữ liệu thành các Class (Model) cực kỳ tao nhã, giúp chúng ta thao tác với dữ liệu mượt mà như đang đọc một cuốn sách.

Thế nhưng, kho tàng phương thức (methods) của Eloquent thì vô tận. Đôi khi chúng ta cứ lặp đi lặp lại vài hàm quen thuộc như where(), get(), hay find() mà bỏ quên hàng loạt các "vũ khí bí mật" cực kỳ mạnh mẽ khác.

Hôm nay, hãy cùng tổng hợp lại "bách khoa toàn thư" các nhóm hàm quan trọng nhất có trong Eloquent Laravel để anh em cứu tủ khi cần nhé!


1. Nhóm khởi tạo và Truy vấn cơ bản (Basic Queries)

Đây là những hàm vỡ lòng nhưng được sử dụng với tần suất 99% trong mọi dự án:

  • all($columns = ['*']): Lấy toàn bộ bản ghi trong bảng. (Cẩn thận khi dùng với bảng hàng triệu dòng nhé!)
  • find($id, $columns = ['*']): Tìm kiếm nhanh một bản ghi dựa trên Khóa chính (Primary Key).
  • findOrFail($id): Giống find, nhưng nếu không tìm thấy, nó sẽ tự động văng lỗi ModelNotFoundException (trả về trang 404), giúp bạn đỡ phải viết lệnh if (!$user) abort(404); thủ công.
  • first(): Lấy ra bản ghi đầu tiên khớp với điều kiện.
  • firstOrFail(): Lấy bản ghi đầu tiên, nếu không có thì văng lỗi 404.
  • get($columns = ['*']): Thực thi câu lệnh truy vấn và trả về một tập hợp (Collection) các kết quả.

2. Nhóm điều kiện và Lọc dữ liệu (Wheres & Filtering)

Bộ lọc điều kiện giúp bạn tinh chỉnh chính xác dữ liệu cần lấy từ database:

  • where($column, $operator, $value) / orWhere(...): Thêm mệnh đề WHERE kinh điển.
  • whereIn($column, $values) / whereNotIn(...): Lọc dữ liệu nằm trong (hoặc không nằm trong) một mảng giá trị (tương đương câu lệnh SQL IN).
  • whereNull($column) / whereNotNull(...): Lọc các bản ghi có cột dữ liệu là NULL hoặc khác NULL.
  • whereBetween($column, [$values]) / whereNotBetween(...): Lọc dữ liệu nằm trong một khoảng giá trị (ví dụ: khoảng giá từ 100k đến 500k).
  • whereDate($column, $date) / whereMonth / whereDay / whereYear: Lọc dữ liệu theo các thành phần thời gian (ngày, tháng, năm) cực kỳ tiện lợi mà không cần tách chuỗi SQL phức tạp.
  • whereColumn($first, $operator, $second): So sánh trực tiếp giá trị giữa hai cột khác nhau trong cùng một bảng.

3. Nhóm sắp xếp, giới hạn và phân trang (Ordering, Limiting & Pagination)

Kiểm soát cách hiển thị và số lượng dữ liệu trả về:

  • orderBy($column, $direction = 'asc'): Sắp xếp kết quả tăng dần (asc) hoặc giảm dần (desc).
  • latest($column = 'created_at') / oldest($column = 'created_at'): Viết tắt cực nhanh của orderBy('created_at', 'desc')orderBy('created_at', 'asc').
  • limit($value) / take($value): Giới hạn số lượng bản ghi trả về.
  • offset($value) / skip($value): Bỏ qua một số lượng bản ghi nhất định (dùng để phân trang thủ công).
  • paginate($perPage = 15): Tự động chia nhỏ dữ liệu thành các trang kèm thông tin phân trang (tính toán sẵn tổng số trang, trang kế tiếp...).
  • simplePaginate($perPage): Phiên bản rút gọn của paginate, chỉ hiển thị nút "Trước / Sau" (tối ưu hiệu năng cho các bảng dữ liệu khổng lồ).
  • cursorPaginate($perPage): Phân trang dựa trên con trỏ (Cursor), là giải pháp tối ưu tuyệt đối cho hệ thống có hàng triệu bản ghi, loại bỏ hoàn toàn độ trễ của câu lệnh OFFSET.

4. Nhóm tối ưu hóa Tổng hợp và Đếm (Aggregates & Counting)

Thay vì phải load toàn bộ dữ liệu lên RAM rồi mới đếm, hãy để Database làm việc đó:

  • count(): Đếm tổng số bản ghi khớp điều kiện.
  • sum($column): Tính tổng giá trị của một cột (ví dụ: tổng doanh thu).
  • avg($column) / mean(...): Tính giá trị trung bình.
  • max($column) / min($column): Tìm giá trị lớn nhất hoặc nhỏ nhất.
  • exists(): Trả về true hoặc false nếu tồn tại ít nhất một bản ghi khớp điều kiện (siêu tối ưu hiệu năng thay vì dùng count() > 0).
  • doesntExist(): Ngược lại với exists().

5. Nhóm thao tác dữ liệu: Thêm, Sửa, Xóa (Insert, Update & Delete)

Cung cấp các phương thức thông minh để thay đổi trạng thái cơ sở dữ liệu:

  • create(array $attributes): Tạo mới và lưu luôn bản ghi vào Database (yêu cầu Model phải bật $fillable hoặc $guarded).
  • firstOrCreate(array $attributes, array $values = []): Tìm xem bản ghi có tồn tại chưa. Nếu có thì trả về, nếu chưa thì tạo mới ngay lập tức.
  • updateOrCreate(array $attributes, array $values = []): Tìm bản ghi theo $attributes, nếu có thì cập nhật bằng $values, nếu chưa thì tạo mới.
  • update(array $values): Cập nhật hàng loạt các bản ghi khớp với tập điều kiện truy vấn trước đó.
  • save(array $options = []): Lưu đối tượng Model hiện tại (dùng khi bạn khởi tạo object bằng new Model() rồi gán thuộc tính thủ công).
  • delete(): Xóa bản ghi hiện tại.
  • destroy($ids): Xóa nhanh một hoặc nhiều bản ghi dựa trên mảng Khóa chính truyền vào mà không cần gọi hàm find() trước.
  • trashed(): (Dành cho Soft Deletes) Kiểm tra xem bản ghi đã bị xóa mềm hay chưa.
  • restore(): Khôi phục lại bản ghi đã bị xóa mềm.
  • forceDelete(): Xóa vĩnh viễn khỏi Database, không qua xóa mềm nữa.

6. Nhóm quan hệ dữ liệu (Relationships & Eager Loading)

Sức mạnh lớn nhất của ORM nằm ở việc liên kết các bảng với nhau:

  • with(['relationName']): Tải trước dữ liệu quan hệ, giải quyết triệt để cơn ác mộng N+1 Query Problem.
  • load('relationName'): Tải quan hệ cho một Model đã được khởi tạo trước đó.
  • has('relationName') / orHas(...): Lọc ra các bản ghi có tồn tại ít nhất một mối quan hệ thỏa mãn.
  • whereHas('relationName', function($query) {...}): Lọc bản ghi dựa trên các điều kiện nằm sâu bên trong bảng quan hệ (Query Nested Relations).
  • withCount('relationName'): Tự động thêm một cột đếm số lượng bản ghi quan hệ (ví dụ: posts_count).

7. Nhóm nâng cao và Tiện ích mở rộng (Advanced & Utilities)

  • chunk($count, callable $callback): Chia nhỏ kết quả thành từng khúc (ví dụ mỗi lần 1000 bản ghi) để xử lý dữ liệu lớn mà không bị tràn bộ nhớ RAM (Out of Memory).
  • cursor(): Trả về một LazyCollection cho phép lướt qua từng bản ghi bằng bộ nhớ cực kỳ tối ưu (stream dữ liệu từ database).
  • select($columns): Chỉ định rõ những cột dữ liệu nào cần lấy ra, giúp giảm tải băng thông mạng và RAM.
  • distinct(): Lọc bỏ các kết quả trùng lặp.
  • groupBy($column) / having(...): Gom nhóm dữ liệu để tính toán thống kê.
  • toSql(): Trả về chuỗi câu lệnh SQL thô mà Eloquent đang chuẩn bị thực thi (vô cùng hữu ích khi cần Debug câu query phức tạp).

Lời kết

Eloquent ORM của Laravel chứa đựng hàng trăm phương thức lớn nhỏ được thiết kế tỉ mỉ để giải quyết mọi bài toán từ đơn giản đến phức tạp trong phát triển phần mềm. Việc nắm vững và sử dụng thuần thục các nhóm hàm này sẽ giúp bạn viết code ngắn gọn hơn, chạy tối ưu hơn và biến công việc lập trình Backend trở thành một trải nghiệm thực sự nghệ thuật!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.