ホームページ  >  に質問  >  本文

Laravel の 3 つの列 (ロール、チーム、プロジェクト) 間の関係。

<p>Laravel では、チーム、プロジェクト、ユーザー、ロール、権限の間に関係があります。 <br /><br />ユーザーは複数のチームを持つことができ、1 つのチームは複数のプロジェクトを持つことができ、ユーザーはユーザー ロール、チーム ロール、およびプロジェクト ロールを持つことができます。プロジェクトごと、チームごと、そしてそのユーザーに対してのみユーザーの権限を取得する方法を知りたいです。 </p>


<p>ユーザー テーブル</strong></p>
    <li>ID</li> <li>名前</li> <li>current_project_id</li> <li>現在のチーム ID</li> <li>role_id</li> <li>etc</li> </ul> <p><strong>Teams テーブル</strong></p>
      <li>id</li> <li>名前</li> </ul> <p><strong>プロジェクト表</strong></p>
        <li>id</li> <li>名前</li> <li>説明</li> </ul> <p>役割テーブル</strong></p>
          <li>id</li> <li>名前</li> <li>type(ユーザー,プロジェクト,チーム)</li> </ul> <p>権限テーブル</strong></p>
            <li>id</li> <li>名前</li> </ul> <p><strong>Role_permission テーブル</strong></p>
              <li>permission_id</li> <li>role_id</li> </ul> <p><strong>project_user テーブル</strong></p>
                <li>プロジェクト ID</li> <li>user_id</li> <li>role_id</li> </ul> <p><strong>team_user テーブル</strong></p>
                  <li>チームID</li> <li>user_id</li> <li>role_id</li> </ul> <p>ユーザーはプロジェクト内で 1 つの役割のみ、チーム内で 1 つの役割のみを持つことができ、ユーザー自身も 1 つの役割 (管理者または一般ユーザー) のみを持つことができます。

                  </p>


                  <pre class="brush:php;toolbar:false;">class User extends Authenticatable { パブリック関数 projectRole() { //ブート時に current_project_id が null なので、where のように project_id を挿入する方法が見つかりません return $this->belongsToMany(Role::class, 'project_user')->where('project_id', '=', $this->current_project_id)->first(); } パブリック関数 projectPermissions() { $this->projectRole()->権限を返します。 } パブリック関数のアクセス許可() { //すべてのチーム権限、プロジェクト権限、ユーザー権限を取得する方法が見つかりません } パブリック関数 role() : BelongsTo { //ユーザーロールは管理者またはサポートのみ可能 return $this->belongsTo(Role::class); } パブリック関数 userPermissions() { $this->role->権限を返します。 } } クラスの役割はモデルを拡張します { パブリック関数のアクセス許可() { 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->gt;teamPermissions($user->currentTeam)->contains($permission) || $ user->teamPermissions($user->currentTeam)->contains($permission) || $user->userPermissions()->contains($permission); });</pre> <p><br /></p>
P粉645569197P粉645569197421日前454

全員に返信(1)返信します

  • P粉471207302

    P粉4712073022023-07-27 13:42:45

    あなたの説明に基づいて、次のようにしました:

    Table******************

    project_user table:

    Schema::create('project_user', function (Blueprint $table) {
        $table->unsignedBigInteger('project_id');
        $table->unsignedBigInteger('user_id');
    });

    permission_role テーブル:

    Schema::create('permission_role', function (Blueprint $table) {
        $table->unsignedBigInteger('permission_id');
        $table->unsignedBigInteger('role_id');
    });

    role_user テーブル:

    Schema::create('role_user', function (Blueprint $table) {
        $table->unsignedBigInteger('role_id');
        $table->unsignedBigInteger('user_id');
    });

    モデル *************

    ユーザー モデル:

    /**
     * Team Relationship
     *
     * @return BelongsToMany
     */
    public function teams(): BelongsToMany
    {
        return $this->belongsToMany(Team::class);
    }
    
    /**
     * Project Relationship
     *
     * @return BelongsToMany
     */
    public function projects(): BelongsToMany
    {
        return $this->belongsToMany(Project::class);
    }
    
    /**
     * Role Relationship
     *
     * @return BelongsToMany
     */
    public function roles(): BelongsToMany
    {
        return $this->belongsToMany(Role::class, 'role_user');
    }

    チーム モデル:

    /**
     * User Relationship
     *
     * @return BelongsToMany
     */
    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class);
    }
    
    /**
     * Project Relationship
     *
     * @return HasMany
     */
    public function projects(): HasMany
    {
        return $this->hasMany(Project::class);
    }

    プロジェクト モデル:

    /**
     * Team Relation
     *
     * @return BelongsTo
     */
    public function team(): BelongsTo
    {
        return $this->belongsTo(Team::class);
    }
    
    /**
     * User Relation
     *
     * @return BelongsToMany
     */
    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class);
    }

    ロール モデル:

    /**
     * Permission Relation
     *
     * @return BelongsToMany
     */
    public function permissions(): BelongsToMany
    {
        return $this->belongsToMany(Permission::class, 'permission_role');
    }
    
    /**
     * User Relation
     * 
     * @return BelongsToMany
     */
    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class,'role_user');
    }

    権限モデル:

    /**
     * Role Relation
     *
     * @return BelongsToMany
     */
    public function roles(): BelongsToMany
    {
        return $this->belongsToMany(Role::class, 'permission_role');
    }

    まず、私たちが期待する役割。例:

    ロール 1: 名前 = スーパー管理者、タイプ = ユーザー

    ロール 2: 名前 = チーム ディレクター、タイプ = チーム

    ロール 3: 名前 = プロジェクト開発user, type=project

    次に、目的のロールをユーザーに割り当てます。これらのロールは、role_user テーブルに保存されます。

    次に、これらの役割に基づいて、各プロジェクトおよびチーム内での各ユーザーの責任を決定できます。


    返事
    0
  • キャンセル返事