我有3种主要型号:
每个用户都将属于一个Branch
,而一个Branch
将拥有许多Users
。
Objects
将同时属于Users
和Branch
,因此Objects
既有user_id
也有branch_id
:
//Objects DB table tructure
[
"id",
"name",
"branch_id",
"user_id",
"created_at",
"updated_at",
]
这是我当前的设置:
Models / Branch.php
public function users()
{
return $this->hasMany(User::class);
}
Models / Users.php
public function branch()
{
return $this->belongsTo(Branch::class);
}
Models / Objects.php
public function user()
{
return $this->belongsTo(User::class);
}
现在,我使用以下Roles
设置了Spatie/Permission:
Super-Admin
:将看到每个Objects
的每个Branch
Admin
:将看到自己的Objects
的每个Branch
,而不是其他Branches
的User
:将看到他在自己的Objects
内或外部创建的每个Branch
我现在的意思是根据用户权限列出所有Objects
。
我的第一个想法是基于模型建立关系,但是我不确定这是一个好主意和实践,这是代码:
public function objects(){
$user = auth()->user();
if ($user->hasRole("Super-Admin")) {
return Object::query();
}
if ($user->hasRole("Admin")) {
return Object::where('branch_id', '=', $user->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
这完全有意义吗?我是否应该使用其他更合适的Laravel功能/ API?
答案 0 :(得分:0)
您使用的方法确实是有道理的,唯一让我担心的是在模型的函数内部使用经过身份验证的用户。
这可能会导致相同的冲突,例如,如果超级管理员想要查看普通用户的对象,则此功能对您没有好处,因为您一直在检索超级管理员的对象。
我将按照以下方式使用您的函数
public function objects(){
if ($this->hasRole("Super-Admin")) {
return Object::query();
}
if ($this->hasRole("Admin")) {
return Object::where('branch_id', '=', $this->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
然后在使用时在控制器上
$user->objects();
您正在检索给定时间的用户对象的对象