2016-06-16 152 views
0

多個「角色」我有兩個型號UserBusinessesLaravel雄辯 - 多對多,對事務所的數據透視表

業務可以有很多的用戶,也是企業可以有許多用戶。

例如:

  • 約翰是業務1管理員。
  • 約翰是業務2超級管理員。
  • Mike是Business1的客戶。
  • Mike是Business1的訂閱者。

什麼是連接這些後來查詢它們的最好方法。

我建一個數據透視表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)創建模型。然後,RoleAssignment有三個belongsTo關係,RoleUserBusiness

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); 
    } 
} 

,你給的查詢,然後可以寫爲:

$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

謝謝你的時間。我不需要那麼多的靈活性,但我需要自定義權限(訂閱者不能像Admin一樣對業務做同樣的事情)。不過,我認爲這很容易與我的設置。 我會更深入地研究你的例子,因爲這是我將來需要的東西。 – dbr