Eloquent ORM và QueryBuilder là gì? Nên sử dụng Eloquent ORM hay QueryBuilder trong Laravel?

Đăng bởi:

Nguyễn Anh Tuấn

Đăng ngày:

Mar 26, 2021

Đăng ở:

Tin Tức Công Nghệ

Eloquent ORM và QueryBuilder là gì? 

Mình tin chắc rất nhiều anh em đã làm việc rất lâu với Laravel, có thể dùng rất nhiều đến cả 2 thứ này nhưng không hề để ý khái niệm chính xác nó là gì? Vậy Eloquent ORM và QueryBuilder là gì?

- Trong Laravel, có 2 cách truy vấn đến database mà chúng ta hay thường dùng đó chính là Eloquent ORMQueryBuilder. 

I. Khái niệm. 

1. Eloquent  là gì?

Eloquent được Laravel cung cấp để lập trình viên tương tác với database 1 cách rễ ràng và đơn giản. Cụ thể, Eloquent đi kèm theo Laravel được cung cấp ActiveRecord đầy đủ. Mỗi 1 bảng ở database sẽ được ánh sạ với 1 model, và model này được sử dụng để tương tác với bảng. 

2. QueryBuilder là gì? 

QueryBuilder được Laravel cung cấp 1 giao diện thuận tiện giúp lập trình viên dễ dàng chạy các truy vấn tới database. Nó có thể được sử dụng để thực thi hầu hết các thao tác về database. 

II. Cách sử dụng

1. Eloquent

Để sử dụng được eloquent, chúng ta cần tạo 1 model tương ứng với bảng trong database. Ví dụ như mình có 1 bảng là User, thì các bạn cần tạo 1 model là User (Cú pháp cmd để tạo model nhanh cho bạn không nhớ hoặc chưa biết là PHP artisan make model Namemodel). Lưu ý là mỗi eloquen đều phải extend  Illuminate\Database\Eloquent\Model vào nhé.

namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    protected $table = 'users';
}

$user = User::all();
 2. QueryBuilder 
 
QueryBuider xây dựng lớp DB để thực hiện truy vấn dữ liệu từ database. Để bắt đầu 1 câu lệnh truy vấn bằng QueryBuider, ta cần dùng hàm tabale(), ví dụ: 
$user = DB::table('users')->where('status',1)->get();

Với câu lệnh này, truy vấn trả về cho bạn 1 mảng dữ liệu object StdClass.

III. So sánh QueryBuider và Eloquent

1. Hiệu xuất

 - Thời gian thực hiện truy vấn của QueryBuider nhanh hơn Eloquent. Lí do là Eloquent phải thêm 1 lớp trong ứng dụng và yêu cầu truy vấn SQL. Vậy tại sao còn sinh ra Eloquent, có nên sử dụng Eloquent không? Câu trả lời là có bạn nhé.

    • Phần quan trọng nhất là nếu chúng ta muốn thay đổi cơ sở dữ liệu khác , thì DB::raw sẽ gây đau đầu cho chúng ta và trong trường hợp đó Laravel Eloquent sẽ giải quyết tất cả các vấn đề một cách đơn giản. Nó có thể xử lý các loại Database khác nhau.
    • Mình lấy ví dụ, nếu như bạn cần đổ ra giao diện danh sách sản phẩm. Ở phần giá, ở cuối giá tiền có đơn vị tiền Việt Nam là VNĐ. Lúc này ta sẽ nên viết 1 hàm, chẳng hạn như là getPrice (hàm để format giá) vào model Product.
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
    protected $table = 'products';
    public function getPrice($value = '') {
        if($this->price != '') {
            return format_price($this->price,$value);
        }else{
            return 'Liên hệ';
        }
    }
    public function format_price($price) {
        if ($price == 0) {
            return "Liên hệ";
        }else{
            return number_format($price, '.', '.').' VND';
        }
    }
}
  • Nhiều bạn sẽ bảo, ủa sao không đổ thẳng ra kiểu {{$data->price}}VND bày vẽ hàm làm gì cho mệt. Không,bạn lại nghĩ đến trường hợp trên trang web của bạn đổ sản phẩm ra rất nhiều page như: Trang chủ, chi tiết sản phẩm, danh mục sản phẩm. Và 1 ngày đẹp trời, khách hàng bạn yêu cầu sửa lại từ đơn vị VND thành Đ, trả nhẽ vào cả 3 trang Trang chủ, chi tiết sản phẩm, danh mục sản phẩm để sửa VND thành đ. Ồ không, thay vì vào từng trang sửa thì vào model và sửa lại cái chỗ format giá từ VND thành Đ có phải nhanh và clear không? 

2. Ưu điểm

- QueryBuider

  • Tốc độ truy vấn nhanh hơn Eloquent, không cần tạo model vẫn có thể truy vấn. 

- Eloquent

  • Khả năng tái sử dụng hàm cao. Ví dụ như getPrice mà mình đã nêu ra ở bên trên.
  • Eloquent dễ dàng liên kết giữa các bảng trong database hơn Query builder 

3. Nhược điểm

- QueryBuider

  • Không tái sử dụng được các hàm, ví dụ như getPrice mà mình đã nêu ra ở bên trên. 

- Eloquent

  • Cần tạo model trước khi truy vấn. Nếu ở Controller cần user Model đó vào nếu không sẽ xảy ra lỗi, tốc độ thực thi chậm hơn QueryBuider. 

 4. Bảo mật

Query builder và Eloquent đều sử dụng : 'PDO parameter binding' nên sẽ giúp chúng ta tránh được lỗi sql injection.

Như vậy, qua bài viết này mình đã giới thiệu và giúp các bạn tìm hiểu về 2 cách truy vấn trong Laravel là Eloquent và QueryBuider. Hi vọng qua bài viết này sẽ giúp các bạn nhớ rõ khái niệm QueryBuider là Eloquent nhé. Chứ đừng như mình hôm nọ bị đứa bạn hỏi lòe gà mà không nhớ 😇

-- Anh Tuấn -- 

 

 

 

 

default_image
Tác giả: Nguyễn Anh Tuấn
ADMIN

Bình luận

Để lại bình luận

Email và số điện thoại sẽ không được công khai. Những trường bắt buộc được đánh dấu *

Repository deleted Your repository has remove
Loading
Bạn cần hỗ trợ?