我对Laravel很陌生,目前正在处理以下问题:
我想创建一个用户组管理。因此,我想将用户添加到组中,并将权限添加到这些组中,以获得授权。我的目标是有一个User::hasRight('exampleRight')
函数,我可以很容易地调用它。为此,我希望在User类内部有一个函数链接。我有这个功能来创建到用户组表的连接(它将用户ID连接到组ID):
public function role()
{
return $this->hasOne('UserGroup');
}
下一个函数将返回一个权限数组。我的计划是写一些类似的东西
public function rights()
{
$rights = Groups::find($this->role()->groups_id)->rights;
return $rights;
}
GroupsModel当然有这个功能来获得权限:
public function rights()
{
return $this->hasMany('Rights');
}
但显然$this->role()->groups_id
没有给我groups_id,而是抛出错误Undefined property: Illuminate'Database'Eloquent'Relations'HasOne::$groups_id
。当我把->groups_id
排除在外,并在控制器中添加它时,比如:
(注意控制器,没有型号!)
public function getUserRole()
{
return User::find(10)->rights->groups_id;
}
它给了我正确的答案。有人能告诉我,出了什么错误吗?我真的不明白怎么了。。。
提前谢谢!
问候
在这个特殊的方法中,您需要删除括号:
public function rights()
{
$rights = Groups::find($this->role->groups_id)->rights;
return $rights;
}
当您执行role()
时,实际上是在告诉Laravel返回关系对象,这样您就可以执行之类的操作
$this->role()->where('x', '=', 'y')->get();
为什么在用户和组之间有一个中间表?只需给用户一个group_id。以下是我过去如何建造的。
用户属于组
组归属ToMany Right
// Inside User Model
public function can($name)
{
foreach ($this->group->rights as $right)
{
if ($right->name == $name)
{
return true;
}
}
return false;
}
// Elsewhere
if (!$user->can('edit_blogs'))
{
return 'FORBIDDEN';
}
- 查看急切加载以减轻性能问题
- 查看筛选器以在控制器或路由级别应用这些访问限制