用户类型的邻接表模型

时间:2015-09-01 13:49:08

标签: laravel eloquent adjacency-list adjacency-list-model

我的数据库中需要相当多的用户类型,到目前为止,唯一不涉及大量表的好选项是使用邻接列表模型。基本上,我的用户首先分为以下类型:业务,个人和管理员。从那里它是这样的:
enter image description here

注意:我目前有3个级别的用户类型,但这可能会随着时间的推移而变化,具体取决于业务需求。

我的所有用户共享一个公共users表,其中包含电子邮件,密码,名字,姓氏等详细信息。我的所有业务用户都有一个单独的businesses表,用于存储业务特定数据。 businesses个用户并不都共享相同的字段,但由于我只需要为每个不同类型的用户提供一些字段,我认为将所有字段放入一个表并存储为NULL的最佳方法可能是我不使用的字段。

现在,我有这个简单的场景。我的所有用户都有一个用户个人资料页面我的商业用户也有商家资料页面。我的业务技术人员必须有另一页特定的页面。 想象一下,计算机技术人员登录。我希望能够显示配置文件页面,业务配置文件页面和技术人员仪表板的链接。

要获取用户类型,我需要进行模型设置,以便检索“子”或“父”。如果我说:

$user = new User::find(11);
$userType = $user->userType; //(relation set in the UserType & User Models)
while($userType != NULL) {
   dump($userType->name);
   $userType = $userType->parent; //(relation set in UserType Model)

}
// dump result:
// 11 - Computer Technician
// 5 - Technicians
// 1 - Business

如何轻松实现检查技术人员的方法(为技术人员仪表板提供链接)以及检查业务(提供业务概况页面链接)?

1 个答案:

答案 0 :(得分:0)

我创建了一个使用通用表表达式(CTE)来实现递归关系的包:https://github.com/staudenmeir/laravel-adjacency-list

您可以使用ancestorsAndSelf关系来检查特定的用户类型:

class UserType extends Model
{
    use \Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;
}

$user = User::find(11);

$userTypes = $user->userType->ancestorsAndSelf;

if ($userTypes->where('name', 'Technicians')->isNotEmpty()) {
    //
}

if ($userTypes->where('name', 'Business')->isNotEmpty()) {
    //
}