2017-03-28 111 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