多對多

讓我們說有角色和許可權。每個角色可能屬於許多許可權,每個許可權可能屬於許多角色。所以會有 3 張桌子。兩個型號和一個資料透視表。一個 rolesuserspermission_role 表。

榜樣

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

許可模式

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

注意:1

在為資料透視表使用不同的表名時考慮遵循。

假設你想使用 role_permission 而不是 permission_role,因為雄辯使用字母順序來構建資料透視表名稱。你需要將資料透視表名稱作為第二個引數傳遞,如下所示。

榜樣

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

許可模式

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

筆記 2

在資料透視表中使用不同的鍵名時考慮跟隨。

Eloquent 假設如果沒有鍵作為第三和第四個引數傳遞,那麼它將是帶有 _id 的單個表名。因此它假設樞軸將具有 role_idpermission_id 欄位。如果要使用除這些之外的其他鍵,則應將其作為第三個和第四個引數傳遞。

讓我們說如果使用 other_role_id 而不是 role_idother_permission_id 而不是 permission_id。所以它將如下。

榜樣

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

許可模式

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

使用 withPivot() 訪問中間表

假設你在資料透視表中有第三列’ permission_assigned_date ‘。預設情況下,只有模型鍵才會出現在資料透視表物件上。現在要在查詢結果中獲取此列,你需要在 withPivot() 函式中新增該名稱。

   public function permissions()
        {
           return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
        }

附加/分離

Eloquent 還提供了一些額外的輔助方法,使相關模型的使用更加方便。例如,假設使用者可以擁有多個角色,而角色可以擁有許多許可權。要通過在連線模型的中間表中插入記錄來將角色附加到許可權,請使用 attach 方法:

$role= App\Role::find(1);    
$role->permissions()->attach($permissionId);

將關係附加到模型時,你還可以傳遞要插入到中間表中的其他資料陣列:

$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);

同樣,要刪除針對角色的特定許可權,請使用 detach 功能

$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);

同步關聯

你還可以使用 sync 方法構建多對多關聯。sync 方法接受要放在中間表上的 ID 陣列。將從中間表中刪除任何不在給定陣列中的 ID。因此,在此操作完成後,只有給定陣列中的 ID 將存在於中間表中:

//will keep permission id's 1,2,3 against Role id 1

$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);