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

    Thay đổi Package Name của Android Studio dể dàng với plugin APR

    Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

    Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

    Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

    Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

    Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

    Chuyển đổi từ monolith sang microservices qua ví dụ

    1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,