+2

Tìm hiểu về mối quan hệ nhiều - nhiều trong Laravel

1. Giới thiệu:

Mối quan hệ nhiều - nhiều (many-to-many) có đôi chút phức tạp hơn mối quan hệ hasOne và hasMany. Một ví dụ cho mối quan hệ nhiều - nhiều là trong hệ thống có nhiều người dùng (user), mỗi người dùng lại có nhiều vai trò (role) khác nhau ( quản lí, nhân viên ...) , mỗi một vai trò không chỉ được đăng kí cho một người dùng ( hệ thống có thể có nhiều quản lí, hoặc nhiều nhân viên)

Thông thường, chúng ta sẽ chỉ phải tạo hai bảng là bảng users và bảng roles, tuy nhiên nếu chỉ với hai bảng này chúng ta sẽ không thể truy vấn được. Vì vậy chúng ta cần phải tạo thêm một bảng thứ ba là bảng role_user. Cấu trúc của các bảng như sau:

users
    id - integer
    name - string
roles
    id - integer
    name - string
role_user
    user_id - integer
    role_id - integer

2. Cấu trúc Model:

Mối quan hệ nhiều - nhiều được định nghĩa bằng cách viết một phương thức trả về kết quả của phương thức belongsToMany:

namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

Trong ví dụ trên chúng ta đang định nghĩa phương thức Roles trong model User, tham số truyền vào cho phương thức belongsToMany là model liên quan ( ở đây là model Role)

Bạn cũng có thể thêm các thao tác để truy vấn. Ví dụ tìm các Roles của User có id là 1 và sắp xếp theo tên

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

Để chỉ ra tên của bảng trung gian, mặc định Laravel sẽ đặt theo kí tự bảng chữ cái, tuy nhiên bạn có thể ghi đè tính năng này bằng cách thêm tham số thứ hai vào phương thức belongsToMany

return $this->belongsToMany(Role::class, 'role_user');

Ngoài việc có thể thay đổi tên của bảng trung gian, bạn có thể thay đổi tên cột của bảng trung gian bằng cách thêm tham số vào phương thức belongsToMany. Tham số thứ ba là khóa ngoại của bảng mà bạn đang định nghĩa mối quan hệ ( hiện tại là bảng users), tham số thứ 4 là khóa ngoại của bảng mà bạn muốn ghép vào ( bảng roles)

return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');

3. Định nghĩa mối quan hệ ngược:

Mối quan hệ này đặc biệt ở chỗ, mỗi quan hệ ngược định nghĩa giống hệt như mối quan hệ thuận. Giờ chúng ta sẽ định nghĩa mối quan hệ cho bảng Roles

 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
 
class Role extends Model
{
    /**
     * The users that belong to the role.
     */
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

4. Tài liệu tham khảo:

  • Eloquent: Relationships

  • All rights reserved

    Viblo
    Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
    Đăng kí