2016-06-16 2 views
0

두 모델 UserBusinesses이 있습니다.Laravel eloquent - manyToMany, sigle 피벗 테이블의 여러 "역할"

비즈니스에는 많은 사용자가있을 수 있으며 비즈니스에는 많은 사용자가있을 수 있습니다. 예를 들어

:

  • 요한은 1 비즈니스의 관리자입니다.
  • John은 Business2 용 수퍼 관리자입니다.
  • 마이크는 Business1의 고객입니다.
  • 마이크는 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)에 대한 모델도 작성하십시오. 당신은

$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, UserBusiness있다 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

관련 문제