Làm thứ làm cho Laravel Request của bạn thú vị hơn

Laravel 5 Eloquent Relationship căn bản

Laravel 5 Eloquent Relationship căn bản

Chào các bạn,

Nay mình sẽ đi một số điều khá hay từ Eloquent của Laravel, đó chính là Relationship trong database.

Vì mình chưa hề giới thiệu về Eloquent, mình xin giới thiệu sơ qua luôn nhé

1/ Laravel 5 Eloquent

Để tạo ra Model trong Laravel 5, ta dùng câu lệnh:

php artisan make:model (tên_model)

php artisan make:model Post

Thực chất khi ta tạo ra 1 model trong Laravel, bản chất nó đã là 1 Eloquent khi ta thấy nó kế thừa từ “Model”.

VD:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

Và để sử dụng được các hàm Eloquent cơ bản, ta cần định nghĩa lại 2 thứ sau trong class

protected $table = 'Post'; //  tên Table

protected $primaryKey = 'ID'; // tên cột ID trong table

public $timestamps = false; // mặc định là false nếu bạn ko xài timestamps của laravel

Ngoài ra muốn an toàn hơn nữa, ta sẽ khai báo các trường sẽ có thể nhập/hiển thị và ko hiển thị vào 2 biến sau:

/**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'Title',
        'Content',
        'CategoryID'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [

    ];

Và khi đã định nghĩa lại xong, ta có thể thoải mái sử dụng toàn bộ hàm của Eloquent đã định nghĩa. Một số hàm cơ bản ta sẽ hay sử dụng:

$post = Post::find($id); // lấy ra post theo ID

// insert cơ bản
$post = new Post;
$post->Title = "Test";
$post->Content = "Test";
$post->save(); // insert

// sau khi insert ta có thể lấy ra id để sử dụng
$post->ID;

// update cơ bản
$post = Post::find(1);
$post->Title = "Sửa";
$post->Content = "Cái này";
$post->save();

// xóa
$post = Post::find(1);
$post->delete();

// lấy toàn bộ record
$posts = Post::all();
// Thông qua Query Builder cho Table này $post = Post::where('CategoryID', 1)->take(20)->get(); // query builder căn bản

Tìm hiểu thêm tại đây: https://laravel.com/docs/5.5/eloquent

2/ Laravel 5 Eloquent Relationship

Lưu ý: mình giới thiệu quan hệ 1 – nhiều ở đây nhé, quan hệ nhiều – nhiều tương tự nhau thui 😀

Và bây giờ ta sẽ đi chuyên sâu vào Laravel 5 Eloquent Relationship căn bản nhé.

Ở trên ta đã có table Post, như các bạn đã thấy mình còn thêm cả trường CategoryID, vậy nên mình sẽ có table Category như sau:

  • Table Category
    • ID
    • Name

Giờ ta lấy ra 1 Post, ta cũng muốn lấy luôn thông tin của Category của Post này. Vậy sẽ có 2 hướng:

  • Query bình thường, dùng Join => Ko elegant..
  • Sử dụng Eloquent Relationship => Đơn giản, dễ sử dụng và đẹp code.

Cũng trong trường hợp tương tự, ta muốn lấy hết toàn bộ Post trong Category này, cũng sẽ có 2 hướng như trên, và cũng phải cần tới join.

Vậy nên mình đánh vào phần Relationship này luôn nhé.

Với 2 table Category và Post này, Relationship sẽ thể hiện dưới dạng như sau:

Laravel 5 Eloquent Relationship căn bản

Trông qua diagram chắc các bạn dễ nhìn hơn nhỉ, Category sẽ có nhiều Post, Post chỉ có 1 Category.

Vậy nên khi ta lấy ra Post, cần luôn thông tin Category, ta sử dụng hàm như sau trong class Post:

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

Giải thích tham số:

  • Tham số đầu tiên là chỉ tới Table nào
  • Tham số thứ 2 là Column nào trong Table hiện tại của mình.
  • Tham số thứ 3 là Column nào trong Table mình muốn lấy thông tin.

Và khi sử dụng? Rất đơn giản:

$post = Post::find($id);

// thông tin category 
$post->category->ID; // id của category
$post->category->Name; // name
Tương tự vậy, đối với Category và ta cần lấy toàn bộ Post, ta định nghĩa hàm như sau tại class Category:

public function posts() // thêm s để dễ nhận dạng giữa [] object và object
{
    return $this->hasMany('App\Post', 'CategoryID', 'ID');
}

Giải thích tham số:

  • Tham số đầu tiên là chỉ tới Table nào
  • Tham số thứ 2 là Column nào trong Table mình muốn lấy thông tin.
  • Tham số thứ 3 là Column nào trong Table hiện tại của mình.

hasMany sẽ trả về cho ta 1 mảng [] objects. VD duyệt hết mảng:

$category = Category::find($id);

foreach ($category->posts as $item)
{
     // sử dụng giá trị....
     $item->Title;
     $item->ID;
     ...
}

So với join, code ta đẹp và ngắn hơn rất nhiều và sử dụng rất tiện phải ko các bạn :D.

Đối với relationship nhiều – nhiều, ta chỉ làm tương tự thôi là sẽ dc kết quả 😀

Bài học về Laravel 5 Eloquent Relationship căn bản đến đây xin kết thúc!

Chúc các bạn thành công với Laravel 5 Eloquent Relationship căn bản!

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

3 thoughts on “Laravel 5 Eloquent Relationship căn bản

Comments are closed.

Bình luận qua Facebook