我对laravel-5相当陌生,到目前为止我很喜欢它,但在我开展项目时,我已经怀疑这个疑问。
在我的应用中,我想要不同的用户类型,让我们说员工,管理员和自由职业者。每种类型都有权利,不同的权限和页面访问权限。由于每个用户类型都有不同的数据,我为我的架构,管理员,员工和自由职业者创建了3个额外的表,并在用户默认表上添加了一个字段user_type,以将其链接到新表,这些表也有user_type,保留我的默认用户表尽可能小,只需登录信息。
所以我开始四处阅读,我在雄辩中提出了多态关系,这显然正是我想要的。在实施这些模型关系和迁移之后,我不知道如何继续移动,以及如何检查用户是自由职业者,管理员还是员工以及如何访问有关该用户类型的特定页面。
这就是我的用户模型的样子:
public function userable()
{
return $this->morphTo();
}
这就是孩子们的样子:
public function user()
{
return $this->morphOne('User', 'userable');
}
答案 0 :(得分:6)
由于您的User
模型为userable
,这意味着users
表应具有多态关系所需的两列:userable_id
和userable_type
。 userable_type
将包含所属模型的类名称(在您的情况下将为Admin
,Freelancer
或Employee
)。所以这将返回用户类型类:
User::find($id)->userable_type; // Use this to identify the user type
虽然通过将信息分成不同的表并使用多态关系来处理它们来规范化数据库结构非常好,但我强烈建议您在单独的结构中处理角色。 Entrust包是一种非常好的方法,因为它允许以非常强大的方式处理用户角色和权限。
答案 1 :(得分:2)
您可以使用zizaco/entrust包。它为您的用户引入了每个角色的角色和权限。
在这种情况下,角色不是由新模型或多态关系定义的,而只是存储在角色表中。然后,用户和角色通过数据透视表 role_user (默认情况下)进行链接。
访问某些页面变得非常简单:
// Checking for a role
$user->hasRole('admin');
// Checking for a single permission
$user->can('edit-users');
这种方法的一大优势是您不必添加新的表,模型,迁移等等来添加新的角色和权限。
如果“每个用户类型都有不同的数据”,它实际上取决于您的意思。如果您的意思是每个角色的权限,那么此包将为您解决此问题。但是,如果您指的是第二个地址等数据或仅属于某些类型用户的数据,我会考虑将这些数据外包给不同的表格是否真的有意义(例如,如果每个用户类型有很多独特的数据) ),或者如果我不在需要的情况下忽略我的用户表中的那些额外列(可能使它们可以为空)。
<强> 编辑: 强>
没有给出关于使用哪个数据库的信息,但是这些情况我个人喜欢从像MySQL这样的无模式数据库切换到MongoDB。也许这是你的选择。