您的解决方案可以正常工作,但为了稍后启用更多灵活性(添加更多角色,定义更多与角色的关系(如权限等)),您可以考虑以下内容(小心,这也引入了一点点的复杂性,所以考虑是否需要这种灵活性)。
为关系创建一个专用模型(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