2017-03-28 29 views
1

私は私が持っているシナリオで正しく関係を取得するために苦労していますね。laravel 5 - 雄弁関係(パーミッションテーブル)

私は私が得るために探していた結果が、私はどちらかUserモデルを通してレベルの列にレベルテーブルから値を取得したいと思い

manager //through User:: model or Auth:: 

である3つのテーブル

Table: users 

| id | username | 
---------------------- 
| 1 | pluto | 
|------|-------------| 

Table: permissions 

| id | user_id | level_id | app_id | 
-------------------------------------------------- 
| 1 |  1  |  2  |  9  | 
|------|-------------|--------------|------------| 

Table: levels 

| id | level | 
---------------------- 
| 1 | admin | 
|------|-------------| 
| 2 | manager | 
|------|-------------| 
| 3 | editor | 
|------|-------------| 

を持っています。これは私のクラスで持っているものの最新バージョンです...

class User extends Authenticatable 
{ 
    public function permissions() 
    { 
     return $this->hasOne('App\Permissions'); 
    } 
} 


class Permissions extends Model 
{ 
    public function user() 
    { 
     return $this->hasMany('App\User'); 
    } 

    public function levels() 
    { 
     return $this->hasMany('App\Levels'); 
    } 
} 


class Levels extends Model 
{ 
    public function permissions() 
    { 
     return $this->belongsTo('Modules\Ecosystem\Entities\permissions'); 
    } 
} 

これをコントローラで使用すると、私はパーミッションテーブルから値を取得できます。しかし、私はこれをしようとすると、レベルのテーブルから値を取得することができませんしかし

$user = User::with('permissions')->find(Auth::user()->id); 

... ...レベルテーブルから値を取得することができませんエラーが発生し

$user = User::with('permissions.levels')->find(Auth::user()->id); 

Column not found: 1054 Unknown column 'levels.permissions_id' in 'where clause' (SQL: select * from `levels` where `levels`.`permissions_id` in (1)) 

私は、このインスタンスでリレーションシップがどのように機能するかを正確には理解していませんが、解決策を推測することは望ましくありません。私はそれを理解したい。

ものはレベルテーブルは、許可レベル(ロール)のリストとして機能,,です。私は、他の方法で許可レベルを定義することができると認識していますが、現時点ではこれはすべての設定方法です。

+0

を行うことができ、私はあなたが定義していると思います権限レベルの関係はまったく反対のoそれが何であるべきかf。 'Permission'は' Level'と 'level'' hasMany'' Permission'に属します。 –

答えて

0

あなたは「役割は」「レベル」で置き換えられて通常のユーザー権限システムを作っている場合は、あなたのテーブルとリレーションシップを再編成する必要があります。

Table: users 

| id | username | level_id | 
--------------------------------------- 
| 1 | pluto |  2  | 
|------|-------------|----------------| 


Table: levels 

| id | level | 
---------------------- 
| 1 | admin | 
|------|-------------| 
| 2 | manager | 
|------|-------------| 
| 3 | editor | 
|------|-------------| 


Table: permissions 

| id | level_id | app_id | 
----------------------------------- 
| 1 |  2  |  9  | 
|------|-------------|------------| 

だから今、ユーザー

hasOne('App\Levels', 'level_id'); 

レベル

hasMany('Modules\Ecosystem\Entities\permissions', 'level_id'); 

権限

あなたがしようとしていた、そしてそれは作品を意志おそらく何
belongsTo('App\Levels', 'level_id'); 

しかし、多くのロールが同じような権限を持っている場合、たとえばadminのマネージャー&は、すべて「ページ」または「コンテンツ」へのアクセス権を持つことができます。パーミッションとレベルとの間に多対多の関係があること。これにより

Table: permissions 

| id | app_id | 
--------------------- 
| 1 |  9  | 
|------|------------| 

Table: levels_permissions 

| level_id | permission_id | 
----------------------------------- 
|  2  |   1   | 
|-------------|-------------------| 

レベル

belongsToMany('Modules\Ecosystem\Entities\permissions', 'levels_permissions', 'level_id', 'permission_id'); 

逆両方のアプローチの権限

belongsToMany('App\Levels', 'levels_permissions', 'permission_id', 'level_id'); 

中関係で、あなたが今

$user = User::with('levels.permissions')->find(Auth::user()->id); 
+0

これらの提案をありがとうございます。このシナリオでは、ユーザーは1つのapp_idに対して1つのlevel_idを持ち、他のapp_idにはもう1つのlevel_idを持つことができます。 – GRowing

+0

私のアクセス許可テーブルは、ユーザーとアプリケーションの間のアクセス許可の関係を実際に追跡します。 – GRowing

+0

"それは本当にユーザーとアプリケーションの間のアクセス許可を追跡"し、アクセス許可テーブルのlevel_idを削除します。次に、ユーザーには多数のアクセス権があり、アプリケーションはbelongsToになります。あなたにとってはより簡単です。 – EddyTheDove