당신의 솔루션은 정상적으로 작동하지만 나중에 더 많은 유연성을 가능하게하기 위해 (역할 추가, 권한과 같은 역할에 더 많은 관계를 정의하는 등), 다음을 고려할 수 있습니다 (조심하십시오. 복잡성이 있으므로 유연성이 필요한지 고려하십시오.
관계 (RoleAssignment
)에 대한 전용 모델을 만들고 다른 역할 (Role
)에 대한 모델도 작성하십시오. 당신은
$user->roleAssignments()->whereHas('role', function ($query) {
return $query->where('name', 'subscriber');
})->with('business')->get()->pluck('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);
}
}
: 다음, RoleAssignment 세 belongsTo
관계에 Role
, User
및 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');
감사합니다. 그다지 융통성이 필요하지는 않지만 사용자 정의 권한이 필요합니다 (구독자는 관리자와 동일한 업무를 수행 할 수 없습니다). 그러나, 나는 그것이 나의 셋업으로 쉽게 할 수 있다고 생각한다. 나는 미래에 필요없는 쓸데없는 일이기 때문에 당신의 모범을 더 깊이 연구 할 것입니다. – dbr