我正在尝试获得三级关系数据,但我使用laravel 5.1迷失了它
我会尝试解释我的情景,希望你能帮助我。
我有两个名为Host
和User
的模型。
此模型按Hostgroup
和Usergroup
模型分组,使用多对多关系。
然后我有一个名为usergroup_hostgroup_permissions
的表,其中Usergroup
与Hostgroup
的关系:
+--------------+----------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------+------+-----+---------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| usergroup_id | int(10) unsigned | NO | MUL | NULL | |
| hostgroup_id | int(10) unsigned | NO | MUL | NULL | |
| action | enum('allow','deny') | NO | | allow | |
| enabled | tinyint(1) | NO | | 1 | |
+--------------+----------------------+------+-----+---------------------+----------------+
我想获取一个属于用户组的用户列表,该用户组在此表中与我的主机所属的主机组有关系。
例如:
我的 host_1 属于DEV_servers
。
在usergroup_hostgroup_permissions
表上,有一个条目允许developers
访问DEV_servers
。
用户组developer
有3个用户 user_1,user_2和user_3 。
任何提示?提前谢谢!
答案 0 :(得分:2)
要获取特定主机中的用户列表,您需要 嵌套 所有基础关系(通过.
)在whereHas
模型上使用User
方法。即。
$users = User::whereHas('usergroup.hostgroups.hosts', function($q) use ($hostID){
$q->where('id', $hostID);
})->get();
此外,如果您要检查用户是否允许 访问 该特定主机,那么您可以链接另一个{{ 1}}如上所述:
where()
注意: 如果您在不明确的$users = User::whereHas('usergroup.hostgroups.hosts', function($q) use ($hostID){
$q->where('id', $hostID)->where('usergroup_hostgroup_permissions.action', 'allow');
})->get();
字段上收到警告,请尝试包含该ID所属的表id
,即hosts
。
我假设你已经为这些模型定义了如下关系:
hosts.id
class HostGroup extends Eloquent {
/** ...
*/
public function hosts(){
return $this->hasMany('App\Host');
}
public function usergroups(){
return $this->belongsToMany('App\UserGroup', 'usergroup_hostgroup_permissions');
}
}
class Host extends Eloquent {
/** ...
*/
public function hostgroup() {
return $this->belongsTo('App\HostGroup');
}
}
class UserGroup extends Eloquent {
/** ...
*/
public function users(){
return $this->hasMany('App\User');
}
public function hostgroups(){
return $this->belongsToMany('App\HostGroup', 'usergroup_hostgroup_permissions');
}
}
希望结果证明是有帮助的。