首页 > 解决方案 > 如何在 Laravel 中使用嵌套的多对多关系从数据库中获取数据

问题描述

我正在研究 LaravelAccess Control Level (ACL)系统。表在哪里包含一些many to many关系。UsertablebelongsToManyRoleTableRole具有多对多关系,反之,与table 具有多对多关系。再次,tablebelongsToMany与table 具有多对多关系,并且与table具有多对多关系。UserRolebelongsToManyPermissionPermissionbelongsToManyRole

我想从用户表中运行一个查询来获取角色的所有权限。该角色通过角色表分配给当前用户。

这是我的代码示例。

用户模型

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

好榜样

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

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

权限表

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

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

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

但它总是return false

标签: phplaravel

解决方案


有很多方法可以检查其中一个角色是否已授予权限。

一个例子,给模型添加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;
}

users或者您可以使用,roles和之间的多个连接进行一次查询,permissions然后使用where('permissions.name', '=', $permission)


推荐阅读