从模型内部访问模型功能


Acces Model-function from inside the model

我对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';
}
  • 查看急切加载以减轻性能问题
  • 查看筛选器以在控制器或路由级别应用这些访问限制