Bài 7. Sử dụng Model trong Laravel 5

Bài trước mình đã giới thiệu về Migrations trong Laravel 5 và tạo database website tin tức. Bài hôm nay chúng ta sẽ đi tổng quan về Model và cách sử dụng model, định nghĩa quan hệ giữa các bảng relationships trong Laravel 5. Đồng thời sẽ tạo model cho dự án website tin tức

Mục Lục:

1. Giới thiệu Model trong Laravel

Như các bạn đã biết thì Model trong mô hình MVC đóng vai trò nhận các request từ Controller, sau đó nó thực hiện giao tiếp với database, sau khi model nhận kết quả sẽ trả ngược về Controller

Đối với Laravel thì nó đi kèm với Eloquent một ORM với Active Record Pattern.Trong Active Record Pattern thì mỗi object sẽ đại diện cho một dòng trong table. Điều này làm cho việc tương tác với database dễ hơn bao giờ hết.

Mỗi một model là một file nằm trong thư mục app. Mặc định model User đã được tạo sẵn và class này sẽ đại diện cho toàn bộ hệ thốn của bạn.

2. Tạo Model và khai báo các thông số trong Laravel

Cú pháp tạo model Laravel

        $ php artisan make:model (tên model)
    

Khai báo các thông số

  • Ở trong Laravel mỗi một model ứng với một bảng dữ liệu trong CSDL và để khai báo model sử dụng bảng dữ liệu nào trong database thì chúng ta cần khai báo tên bảng trong class model.
                    protected $table = 'tableName'; // tên bảng dữ liệu trong CSDL
                
  • Điều chỉnh các cột dữ liệu cần thao tác, ta khai báo như sau:
                    protected $fillable = ['column1','column2',..,'columnn'];
                
  • Laravel cũng cung cấp cho chúng ta tùy biến có sử dụng time stamps hay không. Nếu để true là có và ngược lại false là không
                    public $timestamps = true;
                    //or
                    public $timestamps = false;
                

2. Định nghĩa quan hiệu giữa các bảng relationships

One To One

Quan hệ One To One là quan hệ cơ bản nhất. Ví dụ, một User có thể được liên kết với một Phone

Khi đó ta định nghĩa như sau. Trong model User định nghĩa bằng function sau

        public function phone()
        {
            return $this->hasOne('App\Phone');
        }
    

Trong model Phone định nghĩa bằng function sau

        public function user()
        {
            return $this->belongsTo('App\User');
        }
    

One To Many

Quan hệ One To Many là quan hệ mà một model có nhiều model khác. Ví dụ một bài viết có vố số các bình luận.

Khi đó ta định nghĩa như sau. Trong model Post định nghĩa bằng function sau

        public function comments()
        {
            return $this->hasMany('App\Comment');
        }
    

One To Many (Inverse)

Bây giờ xác định mối quan hệ để cho phép nhận xét truy cập vào bài viết.

Trong model Comment định nghĩa bằng function sau

        public function post()
        {
            return $this->belongsTo('App\Post');
        }
    

Many To Many

Quan hệ Many To Many hơi phức tạp hơn quan hệ hasOnehasMany. Ví dụ như là mối quan hệ của 1 user với nhiều quyền, khi mà các quyền cùng được đảm nhận bởi nhiều user. Cụ thể hơn, nhiều user có thể có cùng quyền "quản trị". Để định nghĩa mối quan hệ này, cần đến 3 bảng: users, roles, và role_user. Bảng role_user xuất phát từ tên của những bảng hay model liên quan, và bao gồm các cột user_id và role_id columns.

Trong model User định nghĩa bằng function sau

        public function roles()
        {
            return $this->belongsToMany('App\Role');
        }
    

Trong model Role định nghĩa bằng function sau

        public function users()
        {
            return $this->belongsToMany('App\User');
        }
    

Lấy các cột của bảng trung gian

Như chúng ta đã biết, khi làm việc với quan hệ nhiều nhiều, ta cần tới 1 bảng trung gian. Eloquent cung cấp nhiều cách rất hữu ích để tương tác với bảng này. Ví dụ hãy giả sử đối tượng User có nhiều đối tượng Role mà nó liên quan đến. Sau khi truy cập vào quan hệ này, chúng ta có thể muốn lấy thông tin bảng trung gian bằng cách sử dụng thuộc tính pivot trong model:

        $user = App\User::find(1);
        foreach ($user->roles as $role) {
            echo $role->pivot->created_at;
        }
    

Ngoài ra còn có quan hệ: Has Many Through, Polymorphic Relations, Many To Many Polymorphic Relations. Bạn có thể tham khảo: tại đây

3. Tạo Model cho website tin tức

Như hình trên ta thấy: một loại tin thì có nhiều bài viết, ngược lại một bài viết chỉ thuộc về một loại tin. Nên ta xác đinh đây là mối quan hệ One To Many

Định nghĩa mối quan hệ giữa các model

Đầu tiên, các bạn tạo 3 model User, Category, Article. Trong đó, mặc định Laravel đã tạo sẵn cho chúng ta model User. Nên ta chỉ cần tao 2 model Category, Article

        // create model Category
        php artisan make:model Category
        // create model Article
        php artisan make:model Article
    

Một Category sẽ có nhiều Article. Do đó ta định nghĩa file model/Category.php như sau:

        namespace App;

        use Illuminate\Database\Eloquent\Model;

        class Category extends Model
        {
            protected $table = 'categories';
            protected $fillable = ['id', 'name', 'parent_id', 'alias', 'description', 'status'];

            public function childs ()
            {
                return $this->hasMany('App\Category', 'parent_id', 'id');
            }

            public function parent ()
            {
                return $this->belongsTo('App\Category', 'parent_id', 'id');
            }

            public function articles ()
            {
                return $this->hasMany('App\Article', 'category_id', 'id');
            }
        }
    

Giải thích một chút về childsparent. Một loại tin sẽ thuộc vào một nhóm loại tin parent, ngược lại một nhóm loại tin sẽ có nhiều loại tin childs. Cái này định nghĩa theo idparent_id của chính model Category

Ví dụ: ta có các loại tin là laravel, php, jquery thì nhóm loại tin của nó chính là lập trình. Khi đó parent_id của các loại tin là laravel, php, jquery chính là id của nhóm loại tin lập trình.

Ngược lại, một Article sẽ có một Category. Do đó ta định nghĩa file model/Article.php như sau:

        namespace App;

        use Illuminate\Database\Eloquent\Model;

        class Article extends Model
        {
            protected $table = 'articles';
            protected $fillable = ['id', 'category_id', 'title', 'alias', 'tag', 'image', 'description', 'content', 'status'];

            public function category ()
            {
                return $this->belongsTo('App\Category', 'category_id', 'id');
            }
        }
    

Video hướng dẫn:

Trong bài này mình đã giới thiệu về Model trong Laravel 5 và hướng dẫn các bạn Tạo model website tin tức. Validate Form trong Laravel 5. Mời các bạn đón đọc. Bài viết trên là những hiểu biết của cá nhân mình nên không tránh phải sai sót, rất mong sự đóng góp ý kiến của các bạn để bài viết trở nên hữu ích hơn.