如何使用Laravel中嵌套的多对多关系从数据库中获取数据

时间:2019-01-06 17:08:01

标签: php laravel

我正在使用Laravel Access Control Level (ACL)系统。 table在哪里包含一些many to many到关系。 User表与belongsToMany表有多对Role,而RolebelongsToMany表则有User相反。{{ 1}}表与Role表具有多对多belongsToMany关系,而PermissionPermission表具有多对多belongsToMany

  

我想从用户表中运行查询,以获取角色的所有权限。通过角色表将此角色分配给当前用户。

这是我的代码示例。

用户模型

Role

角色模型

 public function roles()
{
    return $this->belongstoMany(Role::class);
}

权限表

 public function users()
{
    return $this->belongsToMany(User::class);
}

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

我已经尝试过使用egar加载此查询...

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

但是总是public function hasPermission($permission) { if($this->roles()->with('permissions')->get()->pluck('permissions')) { return true; } return false; }

1 个答案:

答案 0 :(得分:0)

有很多方法可以检查角色之一是否已获得许可。

一个示例,将hasPermission方法添加到User.php模型中

public function hasPermission($permission = '') {
  if ( empty($permisison) ) {
     return false;
  }

  /*
    Find all user roles that have given permission
  */
  $rolesWithPermission = $this
                          ->roles()
                            ->whereHas('permissions', function($query) use ($permission) {
                              $query->where('name', $permission);
                            })
                          ->get();

  /*
    If there is at least one role with given permission,
    user has permission
  */
  return $rolesWithPermission->count() > 0;
}

或者您可以在一个usersrolespermissions之间进行多个联接的查询,并使用where('permissions.name', '=', $permission)过滤结果