Laravel Eloquent:如何获得第三个模型,只使用第二个模型连接的第一个模型

问题描述:

我拥有User,Role和Permission模型。用户只与角色和角色有关系,所以用户和权限之间没有任何关联。Laravel Eloquent:如何获得第三个模型,只使用第二个模型连接的第一个模型

榜样

public function users(){ 
    return $this->belongsToMany('App\User', 'role_user', 'user_id', 'role_id'); 
} 

public function permissions(){ 
    return $this->belongsToMany('App\Permission', 'permission_role', 'permission_id', 'role_id'); 
} 

用户模式

public function roles(){ 
    return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id'); 
} 

权限模型

public function roles(){ 
    return $this->belongsToMany('App\Role', 'permission_role', 'permission_id', 'role_id'); 
} 

所以我能得到了用户的角​​色,如果我做

$users->roles 

现在,我怎么能得到用户角色权限直接使用只用角色和角色连我的用户模式,只有一个谁许可连接

$users->role()->permission 
+5

['hasManyThrough'(https://laravel.com/docs/5.5/eloquent-relationships#has-many-through)看起来像正是你所需要的 – apokryfos

+0

@apokryfos有没有可能使用这个反例呢?类似于用户权限而不是用户权限 –

+0

在文档示例中,国家/地区有许多通过用户发布的帖子,帖子也通过用户属于许多国家。我希望这两个方向都可以和'hasManyThrough'一起工作。 – apokryfos

如果您想只显示用户的配置文件的权限,例如,一个嵌套的foreach会做的伎俩:

<p class="strong">Roles:</p> 
    <ul class="list-group"> 
     @foreach ($user->roles as $role) 
      <li class="list-unstyled">{{ Html::link(url('/roles/'.$role->id),$role->label) }}</li> 
      <ul class="list-group"> 
       @foreach ($role->permissions as $permission) 
        <li class="list-unstyled">{{ Html::link(url('/permissions/'.$permission->id),$permission->label) }}</li> 
       @endforeach 
      </ul> 
     @endforeach 
    </ul> 

Laravel提供了hasManyThrough的方法,这正是你所需要的。 “多对多”关系为通过中间关系访问远程关系提供了便捷的途径。例如,一个国家模式可能有许多通过中间用户模型的Post模型。借助此方法,您可以轻松收集特定国家/地区的所有博客文章。您可以了解更多关于这种关系在官方文档:

https://laravel.com/docs/5.5/eloquent-relationships

hasManyThrough不会多到许多关系的工作。您可以使用嵌套whereHas()获得权限认证的用户:

Permission::whereHas('roles', function ($q) { 
    $q->whereHas('users', function ($q) { 
     $q->where('id', auth()->id()); 
    }) 
})->get(); 

而且在评论中,你已经问了一下倒转的解决方案。如果你想获得指定权限的所有用户,这样做:

User::whereHas('roles', function ($q) use($permissionName) { 
    $q->whereHas('permissions', function ($q) use($permissionName) { 
     $q->where('name', $permissionName); 
    }) 
})->get();