2017-10-08 4 views
1

ユーザー、役割、および権限モデルがあります。ユーザーは役割と役割のみを持ち、役割は権限のみを持つため、ユーザーと権限との間には接続がありません。Laravel Eloquent:2番目のモデルでのみ接続する最初のモデルを使用して3番目のモデルを取得する方法

役割モデル

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'); 
} 

Userモデル

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 

をすれば今どのように私は1つしかない場合許可

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

[ 'hasManyThrough'](https://laravel.com/docs/5.5/eloquent-relationships#has-many-through)がどのように見えますあなたが必要とするものを正確に – apokryfos

+0

@apokryfos可能性は逆もまたこれを使って作るのですか?ユーザーの代わりに許可するユーザーの許可 –

+0

ドキュメントの例では、国はユーザーからの投稿が多く、投稿はユーザーからも多くの国に所属しています。私は両方向が 'hasManyThrough'と同じようにうまく動作すると期待しています。 – apokryfos

答えて

1

と接続した役割と役割にのみ接続し、直接私のUserモデルを使用して、ユーザーの役割の権限を取得することができ、ユーザーの役割を取得あなただけの、たとえば、ネストされた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はを提供しますあなたが必要とするものである10の方法。 「has-many-through」関係は、中間関係を介して遠隔の関係にアクセスするための便利なショートカットを提供する。たとえば、Countryモデルは、中間のUserモデルを介して多くのPostモデルを持つことができます。この方法の助けを借りて、特定の国のすべてのブログ投稿を簡単に集めることができます。あなたは公式ドキュメントでは、この関係についての詳細を学ぶことができます。

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

0

hasManyThrough多対多の関係では動作しません。

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

とコメントで、あなたはで反転するソリューションについて尋ねてきました:あなたは、認証されたユーザーの権限を取得するには、ネストされた whereHas()を使用することができます。あなたが指定した権限に対するすべてのユーザーを取得したい場合は、次の操作を行います。

User::whereHas('roles', function ($q) use($permissionName) { 
    $q->whereHas('permissions', function ($q) use($permissionName) { 
     $q->where('name', $permissionName); 
    }) 
})->get(); 
関連する問題