我正在 Filament 中开发多租户应用程序,并正在努力解决数据库设计问题。
我所做的是,每个用户属于许多租户(在我的例子中是单元),并且每个租户可以拥有多个用户。
创建帐户时,每个用户还会创建一个租户(单元),除非被邀请(通过仪表板)加入已创建的单元。
我想做的是引入角色和权限,以便每个用户获得“所有者”角色 创建租户后,受邀用户应具有“读者”角色。
这意味着每个用户都将拥有与租户(单元)关联的角色。 我正在寻找一个简单的解决方案。
这是目前的情况,我不知道这是否是最好的解决方案。
单位用户 |
---|
用户ID |
单位id |
角色_id |
角色 |
---|
id |
名字 |
描述 |
现在获取当前角色:
public function currentUnitRole()
{
return $this->units()
->where('id', Filament::getTenant()->id)
->with('pivot.role') // Eager load the role relationship
->first()
->pivot
->role;
}
有更好的方法吗?
使用 Filament 处理多租户应用程序时,用户和租户之间的连接涉及各种角色和权限。根据您的解释,用户似乎在不同的租户中拥有不同的角色。要管理这些连接,您必须设置一个中间表。
考虑以下数据库结构和方法:
users
:存储用户信息。units
:存储租户信息。roles
:存储角色信息(如所有者、读者等)。unit_user
:用于存储关系的中间表(数据透视表),还包含 role_id 字段。数据透视表 (
unit_user
):
user_id
unit_id
role_id
:引用 id
表中的 roles
的外键,以确定用户在单位内的角色。雄辩的模型关系:
User
模型,定义 belongsToMany
与 Unit
的关系,并为 role
附加一个枢轴属性。 relationship
到 User
以及 pivot
的 role
信息的单位模型。Illuminate\Database\Eloquent\Relations\Pivot
。而不是
currentUnitRole
,请考虑 Laravel 功能,该功能允许您在向相关用户查询单元期间直接预加载 role
。利用 Eloquent 的 eager
加载需要额外的实现:
public function currentUnitRole()
{
$currentUnit = $this->units()
->where('id', Filament::getTenant()->id)
->with('pivot.role')
->first();
return optional($currentUnit->pivot)->role;
}
这确保了如果没有返回单位,在
->role
上调用 null
不会引发异常。
其他注意事项: