2017-10-08 104 views
1

我擁有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

回答

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> 
0

Laravel提供了hasManyThrough的方法,這正是你所需要的。 「多對多」關係爲通過中間關係訪問遠程關係提供了便捷的途徑。例如,一個國家模式可能有許多通過中間用戶模型的Post模型。藉助此方法,您可以輕鬆收集特定國家/地區的所有博客文章。您可以瞭解更多關於這種關係在官方文檔:

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

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(); 
相關問題