我有一个应用程序使用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软件包都不适合这种范例。它们允许角色和权限,但不根据父子关系确定范围权限。
答案 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();