Tìm hiểu về mối quan hệ nhiều – nhiều trong Lavarel

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í,

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:

namespaceAppModels;useIlluminateDatabaseEloquentModel;classUserextendsModel{/**
     * The roles that belong to the user.
     */publicfunctionroles(){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

namespaceAppModels;useIlluminateDatabaseEloquentModel;classRoleextendsModel{/**
     * The users that belong to the role.
     */publicfunctionusers(){return$this->belongsToMany(User::class);}}

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

  • Eloquent: Relationships
  • Nguồn: viblo.asia

    Bài viết liên quan

    WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

    WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

    Điểm khác biệt giữa IPv4 và IPv6 là gì?

    IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

    Check nameservers của tên miền xem website trỏ đúng chưa

    Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

    Mình đang dùng Google Domains để check tên miền hàng ngày

    Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ