我有两种型号User
和Businesses
。
业务可以有很多用户,而且业务也可以拥有许多用户。
例如:
- John是Business1的管理员。
- John是Business2的超级ADMIN。
- Mike是Business1的客户。
- Mike是Business 1的订户1。
以后将它们连接并查询它们的最佳方法是什么。
我构建了一个枢轴表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
作为下一步。
您的解决方案效果很好,但是以后启用更多弹性(添加更多角色,定义更多的关系,例如权限等),您可以考虑以下内容(注意,这也引入了一些复杂性,因此请考虑是否需要此灵活性)。
为关系创建专用模型(RoleAssignment
),并具有不同角色(Role
)的模型。然后,roleassignment具有三个belongsTo
关系,to 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');