So sánh Eloquent ORM và Query Builder trong Laravel

9234

I. Giới thiệu

Laravel hiện sử dụng 2 kiểu truy vấn phổ biến với database là Eloquent ORM và Query Builder. Sau đây, chúng ta sẽ đi tìm hiểu xem 2 kiểu truy vấn này là gì, và chúng khác nhau như thế nào.

II. Định nghĩa

1. Query Builder là gì?

  • Query Builder cung cấp 1 giao diện thuận tiện và dễ dàng tạo và chạy những truy vấn từ database. Nó có thể được sử dụng để thực thi hầu hết những thao tác về database trong ứng dụng của bạn và làm việc với tất cả những database được hỗ trợ.

2. Eloquent ORM là gì?

  • Eloquent ORM đi kèm với Laravel cung cấp ActiveRecord đầy đủ, đẹp đẽ và đơn giản để làm việc với database. Mỗi bảng của database sẽ được ánh xạ qua ‘Model’, và model này được sử dụng để tương tác với bảng.

III. Cách sử dụng

1. Query Builder

  • Query Builder xây dựng lớp DB để thực hiện các câu truy vấn. Do đó, để bắt đầu 1 Query Builder, ta sử dụng hàm table() trong DB facade.
  • Ví dụ:

  • Truy vấn này sẽ trả về 1 mảng kết quả, trong đó mỗi kết quả là 1 object StdClass của PHP. Bạn có thể truy cập vào giá trị mỗi cột như 1 thuộc tính của object.

2. Eloquent ORM

  • Do trong Eloquent ORM, mỗi bảng của database tương ứng với 1 model nên để bắt đầu sử dụng được nó, ta cần tạo Eloquent model trong thư mục app. Lưu ý là mỗi Eloquent model này đều phải extend Illuminate\Database\Eloquent\Model class.
  • Ví dụ về Eloquent Model:

  • Ví dụ về query sử dụng Eloquent ORM:

  • Kết quả trả về là 1 eloquent collections, trong đó mỗi kết quả là 1 User object.

IV. Một số query đơn giản

Về cơ bản, các câu lệnh query của Eloquent ORM có 1 chút thay đổi so với Query Builder, khiến câu lệnh trông ngắn gọn và đẹp đẽ hơn:

1. Lấy tất cả các bản ghi

  • Query Builder:

  • Eloquent ORM:

2. Lấy bản ghi theo id

  • Query Builder:

  • Eloquent ORM:

3. Lấy 1 bản ghi theo 1 trường xác định

  • Query Builder:

  • Eloquent ORM:

4. Lấy 1 trường nhất định của 1 bản ghi

  • Query Builder:

  • Eloquent ORM:

5. Lấy 1 trường nhất định của tất cả các bản ghi

  • Query Builder:

  • Eloquent ORM:

6. Chunk

  • Fluent Query:

 

  • Eloquent ORM:

7. Aggregates

  • Query Builder:

  • Eloquent ORM:

8. Insert

  • Query Builder:

  • Eloquent ORM:

Nếu sử dụng hàm create thì ta có 1 số cách viết như sau:

9. Update

  • Query Builder:

  • Eloquent ORM:

10. Delete

  • Query Builder:

  • Eloquent ORM:

hoặc xóa theo khóa:

11. Join

  • Query Builder:

  • Eloquent ORM:

Ngoài ra, Eloquent ORM còn cung cấp thêm softDelele, các scope, và các event boot (creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored) giúp cho việc thao tác với database được dễ dàng hơn.

V. So sánh

1. Tính bảo mật

  • Query Builder sử dụng  nhằm bảo vệ ứng dụng và tránh các lỗi về SQL injection trong khi Eloquent ORM chưa làm được điều đó.

2. Tính tương tác

  • Bạn có thể sử dụng tất cả các function của Query Builder trong Eloquent nhưng không thể sử dụng các funcation của Eloquent trong Query Builder.

3. Tính dễ sử dụng

  • Các câu lệnh của Eloquent ORM là ngắn gọn, dễ hiểu và dễ sử dụng hơn so với các câu lệnh khá dài dòng của Query Builder.
  • Hơn nữa, sử dụng Eloquent ORM cũng dễ dàng hơn trong việc kết nối giữa các bảng với nhau.
  • Tuy nhiên, với 1 số truy vấn phức tạp, không sử dụng được Eloquent ORM thì vẫn cần sử dụng Query Builder để cho kết qủa chính xác nhất.

4. Hiệu suất

  • So sánh 1 số query test, thì cho thấy tốc độ của Eloquent ORM bị chậm hơn so với Query Builder, nhất là ở những truy vấn cần thao tác với dữ liệu lớn.

VI. Kết luận

  • Từ trên ta thấy, mỗi 1 loại query đều có ưu và nhược điểm khác nhau. Tùy vào mục đích sử dụng thì ta có thể lựa chọn loại query nào cho phù hợp.
  • Tuy nhiên, ở hệ thống cần tính bảo mật cao và cần xử lý data lớn thì nên dùng Query builder.

VII. Tài liệu tham khảo

  1. Database: Query Builder
  2. Eloquent: Getting Started
  3. LARAVEL ELOQUENT VS FLUENT QUERY BUILDER

Techtalk Via Viblo