---
description: https://viblo.asia/p/eloquent-relationships-in-laravel-phan-1-PdbGnoEdeyA
---

# Many To Many (ok)



**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');
    }
}
```

Một khi các mối quan hệ được xác định, bạn có thể truy cập vào `roles` bằng cách truy cập dynamic property:

```
$user = App\User::find(1);
```

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ư đã đề cập trước đó, để xác định tên bảng của bảng tham gia vào relationship, Eloquent sẽ join 2 model liên quan theo thứ tự của bảng chữ cái. Tuy nhiên, bạn cũng có thể ghi đè quy ước này. Bạn có thể làm như vậy bằng cách thêm vào 1 đối số thứ 2 trong phương thức `belongsToMany` như sau:

```
return $this->belongsToMany('App\Role', 'role_user');
```

Ngoài tùy biến trên, bạn có thể tùy biến các tên cột của các keys bằng cách truyền thêm đối số cho phương thức `belongsToMany`. Đối số thứ 3 là tên foreign key mà bạn đang xác định relationship, trong khi đối số thứ 4 là tên foreign key trong model mà bạn đang join đến.

```
return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
```
