2017-03-28 159 views
1

我想我正努力在我的場景中正確地獲得關係。laravel 5 - 雄辯的關係(權限表)

我有三個表

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

我希望得到的結果是

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

我想無論是通過用戶模型得到的水平表水平列中的值。這是我在我的課上的最後一個版本...

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

我想您所定義權限級別關係完全相反f它應該是什麼。 「權限」屬於「級別」和「級別」具有許多「權限」。 –

回答

0

如果您正在製作一個通常的用戶權限系統,其中'角色'被'levels'取代,那麼您需要重新組織表和關係。

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,編輯器管理員都可以訪問'Page'或'Content'或他們都有權訪問的任何內容,那麼您將需要第4個表格在權限和級別之間具有多對多的關係。

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

感謝您提出這些建議。該方案是,用戶可以爲一個app_id使用一個level_id,而爲其他app_id使用另一個level_id。 – GRowing

+0

我的權限表確實追蹤用戶和應用程序之間的權限關係。 – GRowing

+0

「它會真正跟蹤用戶和應用程序之間的權限」,然後刪除權限表中的level_id。然後,一個用戶有許多權限和一個應用程序屬於一個用戶。更容易爲你。 – EddyTheDove