【问题标题】:Obtain three level relationship on Laravel 5在 Laravel 5 上获取三级关系
【发布时间】:2015-10-24 20:28:45
【问题描述】:

我正在尝试获取三级关系数据,但使用 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

有什么提示吗?提前致谢!

【问题讨论】:

  • 抱歉,不太清楚,要不要通过主机id获取列表?
  • 嗨@AhmadBaktashHayeri,我只放了一张相关的桌子。我想获取有权访问 host_1 的用户。为了获得这一点,我们需要属于 host_1 的主机组,然后获取具有“允许”访问该主机组的用户组。
  • 嘿 Paco,你看我的回答了吗,我认为它会达到你的目的。

标签: php mysql orm laravel-5 relationship


【解决方案1】:

为了获得特定主机中的用户列表,您需要嵌套所有基础关系(通过.)在User 模型上使用whereHas 方法。即

$users = User::whereHas('usergroup.hostgroups.hosts', function($q) use ($hostID){
    $q->where('id', $hostID);
})->get();

此外,如果您想检查用户是否允许 访问该特定主机,那么您可以链接另一个@987654325 @对上面这样:

$users = User::whereHas('usergroup.hostgroups.hosts', function($q) use ($hostID){
    $q->where('id', $hostID)->where('usergroup_hostgroup_permissions.action', 'allow');
})->get();

注意:如果您在不明确的id 字段上收到警告,请尝试包含该id 所属的表hosts,即@987654329 @。

我假设您已经为这些模型定义了如下关系:

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

class User extends Eloquent {
    /** ...
    */

    public function usergroup(){
        return $this->belongsTo('App\UserGroup');
    }
}

希望对你有所帮助。

【讨论】:

  • 嗨@ahmad-baktash-hayeri,你的实现工作完美......非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
相关资源
最近更新 更多