我简化了数据库中的以下关系。
1 User -> n Projects
1 Project -> n Tasks
etc.
所以现在我经常在代码中陷入自我,做以下事情
// Get the current logged in User
$user = Session::getUser();
$project = $this->projects->findById($project_id);
if ( ! $project->hasOwner($user))
// user does not own the project
而随着项目关系的发展,情况变得更糟。例如,然后我必须检查用户是否拥有项目,然后检查任务是否属于项目。
我当时想也许在这里使用“急切加载”,所以我可以根据给定的结果进行过滤。但是随后数据库不得不加载更多的数据,而这通常是必需的。正确的 ?
// Get the current logged in User
$user = Session::getUser();
$project = $user->projects()->find($project_id);
if ( ! $project)
// user does not own the project
但是,即使我那样做,也会感觉到重复和晦涩。我想知道是否有更好的方法来解决这个问题?
尽管用户可以访问他们的项目,但是您需要为将来与其他用户共享项目及其访问类型做好准备。
因此,project_permission
强烈建议您使用一张桌子。
结构应如下:
id | project_id | grantee_user_id | access_user_id | 类型 created_at | Updated_at | Deleted_at
您将拥有3种权限:
您的权限模型:
class ProjectPermission extends Eloquent {
protected $table = "project_permission";
/*
* Types
*/
const OWNER = 1;
const EDIT = 2;
const READ = 3;
/*
* Scopes
*/
public function scopeOwner($query)
{
return $query->whereType(self::OWNER);
}
public function scopeEdit($query)
{
return $query->whereType(self::EDIT);
}
public function scopeRead($query)
{
return $query->whereType(self::READ);
}
public function project()
{
return $this->belongTo('Project','project_id');
}
}
和项目模型:
class Project extends Eloquent {
...
//Always eager load project permission
public $with = ['permission'];
public function permission()
{
return $this->hasMany('ProjectPermission','project_id');
}
public function scopeUserIsOwner($query,$user_id)
{
return $query->has('permission'=>function($q){
return $q->owner()->where('access_user_id','=',$user_id);
});
}
public function scopeCurrentUserIsOwner($query,$user_id)
{
$user = Session::getUser();
$user_id = $user ? $user->id : 0;
return $query->has('permission'=>function($q){
return $q->owner()->where('access_user_id','=',$user_id);
});
}
/*
* @param int $user_id
* @return boolean
*/
public function hasAccessOwner($user_id)
{
return (bool)$this->permission()->whereType(\ProjectPermission::OWNER)->->whereAccessUserId($user_id)->count();
}
}
理想情况下,您应该只加载用户有权访问的项目。并且如果需要检查访问权限,这些hasAccess..
功能将很方便。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句