您的解決方案可以正常工作,但爲了稍後啓用更多靈活性(添加更多角色,定義更多與角色的關係(如權限等)),您可以考慮以下內容(小心,這也引入了一點點的複雜性,所以考慮是否需要這種靈活性)。
爲關係創建一個專用模型(RoleAssignment
),併爲不同角色(Role
)創建模型。然後,RoleAssignment有三個belongsTo
關係,Role
,User
和Business
:
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');
謝謝你的時間。我不需要那麼多的靈活性,但我需要自定義權限(訂閱者不能像Admin一樣對業務做同樣的事情)。不過,我認爲這很容易與我的設置。 我會更深入地研究你的例子,因爲這是我將來需要的東西。 – dbr