从模型内部访问模型 - 函数

时间:2013-11-21 20:30:17

标签: php model laravel laravel-4

我对Laravel很陌生,目前正在解决以下问题:

我想创建一个用户组管理。所以我想将用户添加到一个组并向这些组添加权限,以获得授权。我的目标是拥有User::hasRight('exampleRight')功能,我可以轻松调用。为此我想在User-Class中使用一个函数链接。我有这个函数来创建UserGroup-Table的连接(将User-ID连接到Group-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;
}
它给了我正确的答案。有人能告诉我,错误是什么?我真的没弄错...

提前谢谢你!

此致

2 个答案:

答案 0 :(得分:0)

在此特定方法中,您需要删除括号:

public function rights()
{
    $rights = Groups::find($this->role->groups_id)->rights;
    return $rights;
}

当你执行role()时,你实际上是在告诉Laravel返回关系对象,所以你可以做一些事情,比如

$this->role()->where('x', '=', 'y')->get();

答案 1 :(得分:0)

为什么在用户和组之间有中间表?只需向用户提供group_id即可。以下是我过去如何构建它。

  

用户所属组

     

Group belongsToMany 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';
}
  • 调查急切加载以缓解性能问题。
  • 查看过滤器以在控制器或路由级别应用这些访问限制。