Laravel Eloquent:如何使用仅通过第二个模型连接的第一个模型获得第三个模型

时间:2017-10-08 08:01:23

标签: php 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

3 个答案:

答案 0 :(得分:1)

如果您只想显示用户个人资料的权限,例如,嵌套的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>

答案 1 :(得分:0)

Laravel提供了hasManyThrough方法,这正是您所需要的。 &#34; has-many-through&#34;关系提供了通过中间关系访问远程关系的便捷捷径。例如,Country模型可能通过中间User模型具有许多Post模型。借助此方法,您可以轻松收集特定国家/地区的所有博客帖子。您可以在官方文档中了解有关此关系的更多信息:

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

答案 2 :(得分:0)

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();