2016-06-16 5 views
0

私はUserBusinessesという2つのモデルを持っています。Laravel eloquent - manyToMany、sigleピボットテーブルの複数の "役割"

ビジネスには多数のユーザーが存在することができ、ビジネスには多数のユーザーが存在することがあります。例えば

  • ジョンはBusiness1ためのadminです。
  • JohnはBusiness2のスーパー管理者です。
  • マイクはビジネス1の顧客です。
  • マイクはビジネス1のサブスクライバです。

これを接続して後でクエリするのに最適な方法は何ですか。

私は、ピボットテーブルbusiness_userを構築し、

 $table->boolean('superadmin')->default(false); 
     $table->boolean('admin')->default(false); 
     $table->boolean('customer')->default(false); 
     $table->boolean('subscriber')->default(false); 

はこれが移動するための方法ですか私は違っそれを行う必要があり、ピボット列を追加しましたか?関係のタイプごとにピボットテーブルが異なるだけですが、それは悪い考えのようです。

 $user->businesses()->wherePivot('subscriber',true)->get(); 

私はどこかの構文を逃さなかった願っていますが、私がやった場合ので、他の人の私を修正してください。

は、私はこれらのように照会します。

次のステップとしてRedisもあります。

答えて

1

あなたのソリューションはうまく動作しますが、後でさらに柔軟に対応できるように(役割の追加、権限などの役割へのより多くの関係の定義など)、次のことを考慮する必要があります。複雑さのため、この柔軟性が必要な場合は考慮してください)。

リレーション(RoleAssignment)の専用モデルを作成し、異なるロール(Role)のモデルも作成します。 、あなたが与えたクエリ

class RoleAssignment extends Model { 
    public function role() { 
     return $this->belongsTo(Role::class); 
    } 
    public function user() { 
     return $this->belongsTo(User::class); 
    } 
    public function business() { 
     return $this->belongsTo(Business::class); 
    } 
} 

class Role extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
} 

class User extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
    public function businesses($roleName = null) { 
     return $this->hasManyThrough(Business::class, RoleAssignment::class)->where('name'; 
    } 
} 

class Business extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
} 

、その後のように書くことができます:その後、RoleAssignmentは3人のbelongsTo関係、Roleに、User、そしてBusinessを持っているあなたは、このビットを簡略化するために

$user->roleAssignments()->whereHas('role', function ($query) { 
    return $query->where('name', 'subscriber'); 
})->with('business')->get()->pluck('business'); 

UserモデルのroleAssignmentsリレーションシップを変更して、オプションのロール名を使用できるようにすることができます。

class User extends Model { 
    public function roleAssignments($roleName = null) { 
     $relation = $this->hasMany(RoleAssignment::class); 
     if ($relation) { 
      $relation->whereHas('role', function ($query) { 
       return $query->where('name', 'subscriber'); 
      }); 
     } 
     return $relation; 
    } 
} 

今度は次のクエリを書くことができます:

$user->roleAssignments('subscriber')->with('business')->get()->pluck('business'); 
+0

ありがとうございます。それほど柔軟性は必要ありませんが、私はカスタム権限が必要になります(管理者と同じように、購読者はビジネスと同じことをすることはできません)。しかし、私はそれがセットアップで簡単にできると思います。 私はあなたの事例をもっと深く勉強しましょう。 – dbr

関連する問題