在Laravel 5

时间:2015-08-02 18:41:13

标签: php mysql orm laravel-5 relationship

我正在尝试获得三级关系数据,但我使用laravel 5.1迷失了它

我会尝试解释我的情景,希望你能帮助我。

我有两个名为HostUser的模型。 此模型按HostgroupUsergroup模型分组,使用多对多关系。

然后我有一个名为usergroup_hostgroup_permissions的表,其中UsergroupHostgroup的关系:

+--------------+----------------------+------+-----+---------------------+----------------+
| 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

任何提示?提前谢谢!

1 个答案:

答案 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');
    }
}

希望结果证明是有帮助的。