Laravel中三個欄位之間的關係:角色(Roles)、團隊(Teams)和專案(Projects)。
P粉645569197
2023-07-26 15:10:19
<p>在Laravel中,我有一個團隊、專案、使用者、角色和權限之間的關係。 <br /><br />使用者可以擁有多個團隊,一個團隊可以有多個項目,而使用者可以擁有使用者角色、團隊角色和專案角色。我想知道如何取得使用者在每個專案、每個團隊以及僅限使用者的權限。 </p><p><br /></p>
<p><strong>User table</strong></p>
<ul>
<li>Id</li>
<li>name</li>
<li>current_project_id</li>
<li>current_team_id</li>
<li>role_id</li>
<li>etc</li>
</ul>
<p><strong>Teams table</strong></p>
<ul>
<li>id</li>
<li>name</li>
</ul>
<p><strong>Projects table</strong></p>
<ul>
<li>id</li>
<li>name</li>
<li>description</li>
</ul>
<p><strong>Roles table</strong></p>
<ul>
<li>id</li>
<li>name</li>
<li>type(user,project,team)</li>
</ul>
<p><strong>Permissions table</strong></p>
<ul>
<li>id</li>
<li>name</li>
</ul>
<p><strong>Role_permission table</strong></p>
<ul>
<li>permission_id</li>
<li>role_id</li>
</ul>
<p><strong>project_user table</strong></p>
<ul>
<li>project_id</li>
<li>user_id</li>
<li>role_id</li>
</ul>
<p><strong>team_user table</strong></p>
<ul>
<li>team_id</li>
<li>user_id</li>
<li>role_id</li>
</ul>
<p>使用者在一個專案中只能擁有一個角色,在一個團隊中也只能擁有一個角色,而在使用者本身也只能擁有一個角色,該角色可以是管理員或一般使用者。</p><p>我正在嘗試獲取使用者專案角色的方式,同時我已經跳過了團隊的程式碼,因為我認為它與專案的程式碼非常相似。 </p><p><br /></p>
<pre class="brush:php;toolbar:false;">class User extends Authenticatable
{
public function projectRole()
{
//I can't find the way to insert project_id like in where, because current_project_id is null in boot
return $this->belongsToMany(Role::class, 'project_user')->where('project_id', '=', $this->current_project_id)->first();
}
public function projectPermissions()
{
return $this->projectRole()->permissions;
}
public function permissions()
{
//I can't find the way to get all team permission, project permissions and user permissions
}
public function role() : BelongsTo
{
//Only can be User role, Admin or Support
return $this->belongsTo(Role::class);
}
public function userPermissions()
{
return $this->role->permissions;
}
}
class Role extends Model
{
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
}</pre>
<p>我想用權限作為門檻,傳遞給Inertia前端,我正在嘗試類似這樣的方法。 </p>
<pre class="brush:php;toolbar:false;">Gate::before(function ($user, $permission) {
return $user->projectPermissions($user->currentProject)->contains($permission) || $user->teamPermissions($user->currentTeam)->contains($permission) || $ user->teamPermissions($user->currentTeam)->contains($permission)
|| $user->userPermissions()->contains($permission);
});</pre>
<p><br /></p>
根據您的解釋,我按照以下方式進行操作:
表格*************
project_user 表:
permission_role 表:
role_user 表:
Models *************
使用者模型:
團隊模型:
專案模型:
角色模型:
權限模型:
首先,我們創建我們期望的角色。例如:
角色1:名稱=超級管理員,類型=使用者
角色2:名稱=團隊主管,類型=團隊
角色3:名稱=專案開發者,類型=項目
現在,我們將期望的角色指派給我們的使用者。這些角色儲存在role_user表中。
然後,根據這些角色,您可以確定每個使用者在每個專案和團隊中的職責。