【问题标题】:Acces Model-function from inside the model从模型内部访问模型函数
【发布时间】:2013-12-06 12:43:49
【问题描述】:

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

我想创建一个用户组管理。所以我想将用户添加到一个组并为这些组添加权限,以获得授权。我的目标是拥有一个User::hasRight('exampleRight') 函数,我可以轻松调用它。为此,我想在用户类内部有一个函数链接。我有这个函数来创建到 UserGroup-Table 的连接(它将用户 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;
}

它给了我正确的答案。有人可以告诉我,错误是什么?我真的不明白这是怎么回事......

提前谢谢你!

问候

【问题讨论】:

    标签: php model laravel laravel-4


    【解决方案1】:

    为什么在用户和组之间有一个中间表?只需给用户一个 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';
    }
    
    • 研究预先加载以缓解性能问题。
    • 查看过滤器以在控制器或路由级别应用这些访问限制。

    【讨论】:

    • 首先,感谢您的帮助。这实际上是一种非常直接的方式,我很想这样做,但不幸的是,数据库结构是这样指定的。所以我不能那么容易改变它。我认为我正在构建我的应用程序的系统假设一个用户具有多个角色......
    【解决方案2】:

    在这个特定的方法中,您需要删除括号:

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

    当您执行role() 时,您实际上是在告诉 Laravel 返回关系对象,因此您可以执行以下操作

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

    【讨论】:

    • 您好,谢谢您的回答。不幸的是,当这样做时,我得到了这个错误:Call to a member function getResults() on a non-object,可能是因为$this->role() 不返回数组,而是像{"id":2,"user_id":10,"groups_id":1} 这样的 JSON 字符串。有什么我想念的吗?
    • Laravel 为您处理。您必须首先确保 $this->role->groups_id 返回的东西和 ID 存在于 Groups 表中,否则 ->rights 会给您一个错误。
    • 好吧,如果我在控制器中触发User::find(10)->role->groups_id;,它会返回正确的信息。如果我在模型中做$this->role->groups_id,我会得到上面的错误...
    • 好吧,不知怎的,我一定是有些愚蠢。它按你的方式工作:) 我一定做了一些愚蠢的事情。非常感谢!
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2021-06-05
    • 2018-02-21
    • 2018-04-21
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多