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