Laravel Eloquent ORM Phần 2: Xử lý database relationship

0

Trong thế giới thực tại, mọi vật đều có những kết nối với nhau, ví dụ một ngôi nhà phải có người sở hữu, một cuốn sách phải có tác giả (một hoặc nhiều tác giả), một đơn hàng phải liên quan đến một hoặc nhiều sản phẩm… Cơ sở dữ liệu cũng giống như vậy, mỗi bảng là một cá thể và các bảng có thể có các mối quan hệ với nhau do các bảng này cũng đều đại diện cho một vật nào đó. Laravel Eloquent ORM xử lý các mối quan hệ dựa trên các Eloquent Model rất dễ dàng, nó hỗ trợ rất nhiều các mối quan hệ khác nhau trong database như một – một, một – nhiều, nhiều – nhiều, quan hệ đa ngôi, quan hệ đa hình…

Định nghĩa các mối quan hệ trong Eloquent Model

Eloquent Model định nghĩa các quan hệ bằng các phương thức trong Model, một ưu điểm là có thể sử dụng chuỗi phương thức và tăng cường khả năng truy vấn dữ liệu. Ví dụ dưới đây giúp bạn thấy được sức mạnh của khai báo relationship trong Eloquent Model:

$user = User::where('name', 'FirebirD')->first();

$posts = $user->post()->where('active', 1)->get();

biến $posts sẽ chứa tập hợp các bài viết của một user đang được đăng. Nếu như không có các thiết lập quan các quan hệ, đoạn code trên phải thực hiện như sau:

$user = User::where('name', 'FirebirD')->first();

$posts = Post::where('user_id', $user->id)->where('active', 1)->get();

Đây chỉ là một ví dụ đơn giản nhất, bạn đã thấy việc khai báo relationship trong Eloquent Model giúp cho code ngắn gọn nhưng cũng rất tường minh

Các mối quan hệ trong Eloquent.

-Trước đây Laravel version 4.0 thì chỉ cung cấp cho chúng ta 3 mối quan hệ chính, nhưng đến phiên bản hiện tại con số đó đã được nâng lên là mối quan hệ.

-Gồm:

  • One to One : Một Một.
  • One to Many: Một nhiều.
  • Many to Many: Nhiều nhiều.
  • Has Many Through: Nhiều nhiều qua lại trung gian.
  • Polymorphic Relations: Đa hình.
  • Many To Many Polymorphic Relations : Nhiều nhiều đa hình.

One to One

Mối quan hệ one-to-one là mối quan hệ hết sức cơ bản. Ví dụ, một User có thể được liên kết với 1 Phone. Để xác định mối quan hệ này, chúng ta đặt một method phone trên User model. Phương thức phone nên trả về kết quả của 1 phương thức hasOne trên cơ sở của lớp Eloquent model:

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

Dynamic properties cho phép bạn truy cập vào các relationship functions như thể nó là thuộc tính được định nghĩa trên các model:

$phone = User::find(1)->phone;

Ngoài ra, Eloquent cho rằng foreign key cần phải có một giá trị phù hợp với cột id của parent. Nói cách khác, Eloquent sẽ tìm kiếm những giá trị của cột id của User trong cột user_id của các bản ghi Phone. Nếu bạn muốn relationship sử dụng các cột khác với cột id, bạn có thể truyền thêm 1 đối số thứ 3 trong phương thức hasOne như sau:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');

Bây giờ, chúng ta sẽ định nghĩa 1 relationship trên Phone model sẽ cho phép chúng ta truy cập vào User model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

One To Many

Một quan hệ one-to-many được sử dụng để xác định các mối quan hệ khi một model sở hữu nhiều số lượng của model khác. Ví dụ, 1 blog post có nhiều comment. Giống như nhiều Eloquent relationship khác, one-to-many được xác định bằng 1 function được đặt ở model của bạn:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
    }
}

Dĩ nhiên, vì tất cả các relationship cũng phục vụ query builder, bạn cũng có thể thêm các ràng buộc để comment được lấy ra và tiếp tục thêm các chuỗi query:

$comments = App\Post::find(1)->comments()->where('title', 'foo')->first();

Định nghĩa phương thức Nghịch đảo của quan hệ,chúng ta dùng phương thức belongsTo như các MHQ khác

Many To Many

many-to-many, mối quan hệ hơi phức tạp hơn so với hasOne và hasMany. Một ví dụ cho mối quan hệ này như là 1 user sẽ có nhiều roles và 1 role cũng sẽ thuộc về nhiều user. Để xác định relationship này, cần thiết phải có 3 bảng: users, roles và user_role. Bảng user_role sẽ chứa 2 column user_id và role_id.

Quan hệ many-to-many được định nghĩa bằng cách gọi phương thức belongsToMany dựa trên Eloquent class. Ví dụ, hãy định nghĩa phương thức roles trên User model.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

Dĩ nhiên, giống như tất cả các relationship khác, bạn có thể gọi phương thức roles và tiếp tục cho thêm vào các query:

$roles = App\User::find(1)->roles()->orderBy('name')->get();

Định nghĩa phương thức Nghịch đảo của quan hệ,chúng ta dùng phương thức belongsTo như các MHQ khác

Leave A Reply

Your email address will not be published.