2016-06-16 196 views
0

多个“角色”我有两个型号UserBusinessesLaravel雄辩 - 多对多,对事务所的数据透视表

业务可以有很多的用户,也是企业可以有许多用户。

例如:

  • 约翰是业务1管理员。
  • 约翰是业务2超级管理员。
  • Mike是Business1的客户。
  • Mike是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)创建模型。然后,RoleAssignment有三个belongsTo关系,RoleUserBusiness

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'); 
+0

谢谢你的时间。我不需要那么多的灵活性,但我需要自定义权限(订阅者不能像Admin一样对业务做同样的事情)。不过,我认为这很容易与我的设置。 我会更深入地研究你的例子,因为这是我将来需要的东西。 – dbr