11/08/2018, 20:57

Thủ thuật Eloquent trong Laravel

Trong bài viết này, mình sẽ chia sẻ một vài thủ thuật hay mà bạn có thể làm với Eloquent của Laravel. Như chúng ta đã biết thì Laravel hỗ trợ cho chúng ta nhiều cách để tương tác với cơ sở dữ liệu. Và Eloquent ORM là một thế mạnh rất lớn Laravel có trong khi các framework không hỗ trợ. Vì vậy tại ...

Trong bài viết này, mình sẽ chia sẻ một vài thủ thuật hay mà bạn có thể làm với Eloquent của Laravel. Như chúng ta đã biết thì Laravel hỗ trợ cho chúng ta nhiều cách để tương tác với cơ sở dữ liệu. Và Eloquent ORM là một thế mạnh rất lớn Laravel có trong khi các framework không hỗ trợ. Vì vậy tại sao chúng ta không đi sâu một chíu để soi vài thủ thuật Eloquent ít được biết tới. Biết đâu những tips như vậy có thể phần nào giúp bạn giảm bớt thời gian code hơn một chút trong quá trình phát triển ứng dụng web. Bây giờ bắt đầu thôi nhỉ?

Thủ thuật Eloquent trong Laravel - Eloquent Tips And Tricks

Thủ thuật Eloquent trong Laravel

Tạo danh sách Dropdown lựa chọn dễ dàng với method "List" trong Eloquent

Lấy một ví dụ thế này: Giả sử chúng ta có mối quan hệ Category - Post trong CSDL. Một bài post sẽ chỉ thuộc về một Category nào đó. Bây giờ chúng ta muốn trong Form tạo mới bài post sẽ có một dropdown box chứa các Category để select thì phải làm thế nào?
Đây là thủ thuật Eloquent mà sẽ làm giúp chúng ta công việc trên như sau:
Sử dụng method List sẽ trả về một mảng giá trị và chúng ta có thể dễ dàng pass qua View bằng method Form::select.

// Lưu danh sách category vào biến $categories
$categories = Category::lists('title', 'id');
// Pass $categories ra View sử dụng Form HTML Collective
{{ Form::select('category', $categories) }});
Bây giờ chúng ta đã có một dropdown hiển thị tên các Category để chọn nhưng lại lưu giá trị id của Category vào CSDL. Chỉ đơn giản vậy thôi!

Tạo cùng lúc cả Model và Migration trong Laravel

Đây là một thủ thuật rất phổ biến và có thể bạn đã biết. Tuy nhiên mình vẫn liệt kê ra vì trang chủ Laravel không đề cập tới và sử dụng nó sẽ giúp chúng ta đỡ thêm một bước. Lấy một ví dụ nhỏ khi bạn build một blog bằng Laravel mà muốn tạo cả Model cũng như Migration file cho các posts. Bình thường thì bạn sẽ lần lượt chạy 2 câu lệnh Artisan như sau:
$ php artisan make:migration create_posts_table
$ php artisan make:model Post
Tuy nhiên thực ra chúng ta chỉ cần dùng 1 câu lệnh là đủ:
$ php artisan make:model Post -m
Rất đơn giản phải không :D?

Eloquent Query Scopes

Sử dụng lại ví dụ về Blog ở mục trên, giả sử table posts của chúng ta có một cột is_published lưu giữ một trong 2 giá trị 0 và 1 (tương ứng với false và true). Bây giờ ở trang blog index, chúng ta chỉ cho phép người dùng xem những bài viết đã được published, tức là is_published = 1. Vậy làm thế nào để lọc các bài post chưa được published sử dụng Eloquent? Câu trả lời rất đơn giản: sử dụng truy vấn where
Post::where('is_published', true)->get();

Chỉ cần như vậy là đã ổn. Tuy nhiên nếu như chúng ta muốn sử dụng lại câu truy vấn trên ở một vài nơi khác. Bạn có thể làm vậy tuy nhiên nó không hợp với nguyên tắc lập trình DRY cho lắm. Thay vào đó, chúng ta có thể sử dụng Eloquent Query Scopes để code dễ đọc và tái sử dụng hơn. Ở trong Post model, chúng ta sẽ tạo method mới tên là scopePublished:

class Post extends Model
{
    public function scopePublished($query)
    {
        return $this->where('is_published', true);
    }
}
Để lấy ra các bài post đã được publish, đơn giản chúng ta chỉ cần gọi
Post::published()->get();
Laravel sẽ hiểu và tự động dịch sang method scopePublished. Lưu ý rằng bất cứ method nào ở trong Eloquent mà có tiền tố là scope đều được Laravel auto translate như kiểu vừa rồi. (Chả biết phải diễn tả thế nào cho chuẩn nữa :D) Tham khảo thêm ở Laravel Documentation.

Accessors

Accessors cho phép bạn thay đổi lại giá trị các thuộc tính của Eloquent khi lấy ra từ Model. Nói suông thì khá là khó hiểu. Hãy thử một ví dụ như sau: Giả sử chúng ta có bảng users. Trong đó có 2 cột dữ liệu là forenames và surname. Nếu chúng ta muốn hiển thị fullname của user trong View, thường thì chúng ta làm như sau:
{{ $user->forenames . ' ' . $user->surname }}

Rõ ràng cách trên không được ổn cho lắm. Thứ nhất, nếu chúng ta muốn hiển thị fullname nhiều lần thì sao? Lại phải lặp đi lặp lại code như trên à. Thứ hai, nhìn cách code trên xấu xí vãi chưỡng :D hehe. Bây giờ chúng ta có thể làm đẹp lại đoạn code trên với accessors trong Laravel. Hãy tạo method mới trong User model.

class User extends Model
{
    public function getNameAttribute()
    {
        return $this->forenames . ' ' . $this->surname;
    }
}

Tương tự như cái cách mà Eloquent tự động nhận dạng scope ở thủ thuật trước đó, bất cứ cái gì được bao đóng giữa get và Attribute trong tên của method đều được Eloquent ngầm hiểu là một accesor. Bây giờ chúng ta có thể dễ dàng hiển thị fullname của user trong View bằng cú pháp đơn giản như sau:

{{ $user->name }}

Nhìn dễ đọc và khả năng tái sử dụng được cải thiện hơn nhiều, đúng không?

Dynamic Method Names

Cũng khá tương tự như scope và accesor. Chúng ta thử lấy ví dụ với method where chẳng hạn:

// Post::where('published', 1)->get();
Post::wherePublished(1)->get();

// Post::where('category', null)->get();
Post::whereNull('category')->get();

// Post::where('category', '!=', null)->get();
Post::whereNotNull('category')->get();

Một chút dễ đọc hơn, thế là đủ!

Eloquent Relationships tự động orderBy

Giả sử chúng ta có mối quan hệ một nhiều giữa bảng Categories và Products. Chúng ta thường hiển thị danh sách các product ra ngoài View. Nếu chúng ta muốn sắp xếp thứ tự theo bảng chữ cái thì chúng ta có method orderBy của Eloquent. Nhưng cứ mỗi lần hiển thị lại phải query y như vậy tiếp hay sao? Chúng ta nên định nghĩa thứ tự sắp xếp ngay ở trong Model.

Bình thường thì Model Products sẽ có dạng như này:

class Category extends Model
{
    public function products()
    {
        return $this->hasMany('AppProduct');
    }
}

Bây giờ chúng ta có thể tự động sắp xếp các products theo title ở bất cứ query nào mà có sử dụng mối quan hệ này:

    public function products()
    {
        return $this->hasMany('AppProduct')->orderBy('name');
    }

Bây giờ mọi thứ đã có trật tự cả rồi!

Kết luận

Trên đây chỉ là một số thủ thuật Eloquent trong Laravel. Trong những lần tiếp theo mình sẽ giới thiệu thêm nhiều thủ thuật hay không chỉ với Eloquent. Cảm ơn các bạn đã theo dõi!

BÀI VIẾT ĐƯỢC PUBLISH TRÊN LARAVEL-PHP.COM
Link bài viết gốc: http://laravel-php.com/laravel-framework/thu-thuat-laravel/thu-thuat-eloquent-trong-laravel/

0