1

我的数据库中有相当多的用户类型,到目前为止,唯一不涉及大量表的好选择是使用邻接列表模型。基本上,我的用户首先分为以下类型:企业、个人和管理员。从那里开始是这样的:
在此处输入图像描述

注意:我目前有 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

如何轻松实施一种方法来检查技术人员(以提供技术人员仪表板的链接)并检查企业(以提供业务资料页面链接)?

4

1 回答 1

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()) {
    //
}
于 2019-05-26T15:16:16.120 回答