Laravel多级分层用户系统

时间:2015-08-12 13:59:05

标签: laravel authentication laravel-4 user-management

我有一个应用程序使用Laravel作为后端API,AngularJS作为前端,具有多层用户树,用户"拥有"其他用户群。

例如,可能有一位业主拥有主管,而主管又拥有员工。

员工有"墙壁"有帖子和评论。只有员工才有墙。他树枝上的任何用户都可以在他的墙上查看/发布/评论 - 因此他的直接主管和所有者可以访问他的墙。

我希望将来可扩展以增加更多"角色"介于两者之间,所以我不想为每种用户类型分别创建表格。

我查看过自我反映的模型,其中users表有一个parent_id列。因为Auth :: user->(' children')正在返回所有用户,忽略了模型中设置的关系,我度过了一段艰难的时光:

public function children() {
  return $this->hasMany('User', 'parent_id');
}

public function parent() {
  return $this->belongsTo('User', 'parent_id');
}

问题在于 - 是否有可用的包允许我通过这些分层用户关系自动调整查询范围?

或者你对这样的用户范例有什么建议?我尝试过的所有搜索以及我看过无处可寻的软件包。我认为使用嵌套set包对于这个任务来说太复杂了。我所看到的任何auth软件包都不适合这种范例。它们允许角色和权限,但不根据父子关系确定范围权限。

3 个答案:

答案 0 :(得分:1)

目前,一个有效的硬编码解决方案是向User模型添加子关系:

public function children() {
  return $this->hasMany('User', 'parent_id');
}

...并在AuthController中(我希望孩子们返回):

$children = Auth::user()->children()->with('children', 'children.children')->get();

这提供了3个级别,可以通过添加'children.children.children'轻松扩展(尽管不仅仅是添加到数据库中)。

我还可以通过以下方式检查它是否是员工(层次结构的最低级别):

if(empty($children->toArray()) {}

答案 1 :(得分:0)

请尝试以下操作 - 这仅适用于儿童 - 未经测试!

将此添加到用户模型类

public function scopeBelongingTo($query, $parentId)
{
    return $query->whereHas('parent', function($query) use ($parentId)
    {
        $query->where('id', $parentId);
        $query->orWhereHas('parent', function($query) use ($parentId)
        {
           $query->where('id', $parentId);
            $query->orWhereHas('parent', function($query) use ($parentId)
            {
               $query->where('id', $parentId);
                $query->orWhereHas('parent', function($query) use ($parentId)
                {
                   $query->where('id', $parentId);
                    $query->orWhereHas('parent', function($query) use ($parentId)
                    {
                       $query->where('id', $parentId);
                    });
                });
            });
        });
    });
}

要找到孩子(和孙子孙女,孙子孙女等),请尝试以下方法:

$idOfParent = 1; // Replace this with the ID of a parent you wish to query their children sub children
$users = User::belongingTo($idOfParent)->get();
dd($users->toArray()); // Should output the parent's childrens in the entire hierarchy down to tier 5...

如果这不起作用,请回复错误,我们会从那里看到。

重要 - 此特定示例仅适用于5个级别。为了提高水平,我们必须包括whereHas。在关系中可能有一种方法可以做到这一点,但只要您的应用程序分离得很好,就应该很容易将其交换出来。

答案 2 :(得分:0)

通过将方法添加到自身-> with('children')中,选择的答案会更好,因此每个子结果都将有其子项(使其递归)。无需使用点符号,这在某些情况下可能是不可能的。

public function children() {
   return $this->hasMany('User', 'parent_id')->with('children');
}

您的AuthController将是:

$children = Auth::user()->children()->get();