0

我正在尝试在 CakePHP 中使用 Containable 的一个相当奇怪的场景。

  • 组 hasAndBelongsToMany 用户
  • 组属于用户
  • 用户 hasAndBelongsToMany 组

我不确定,但要么我的查询有问题,要么我认为 Containable 可能很难自动确定我在我的条件下试图引用哪个“用户”。(一个部门有一个部门主管,因此该组属于用户。一个部门也有HABTM员工,反之亦然,因此有两个HABTM链接。)

从用户控制器(对于视图),我试图获取用户所属的部门(组),并且只获取部门。

在用户模型中:

public function findDepartments($id) {
    $user = $this->find('first', array(
        'conditions' => array(
            'User.id' => $id
        ),
        'contain' => array(
            'Group.logical_group = 0',
            'Group' => array(
                'User' => array('fields' => array(
                    'id',
                    'firstName',
                    'lastName',
                    'ext'
                ))
            )
        )
    ));
    return $user;
}

这给了我一个包含我需要的所有信息的数据数组。但是,由于我想保持控制器瘦身和模型胖,我想消除我得到的返回值 - 其中用户在数据中返回。

返回的数据:

Array
(
    [User] => Array
        (
            [id] => 46
            [username] => ytruly
            [firstName] => Yours
            [nickname] => 
            [lastName] => Truly
            [active] => 1
            [created] => 2009-10-06 19:10:13
            [lastlogin] => 2013-10-03 12:47:52
            [deactivated] => 
            [name] => Truly, Yours
        )
    [Group] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => Administration
                    [parent_id] => 
                    [logical_group] => 
                    [user_id] => 70
                    [GroupsUser] => Array
                        (
                            [id] => 225
                            [group_id] => 1
                            [user_id] => 46
                        )
                    [User] => Array
                        (
                            [id] => 70
                            [firstName] => Head
                            [lastName] => Honcho
                            [ext] => 201
                        )

                )
            [1] => Array
                (
                    [id] => 2
                    [name] => Computer Services
                    [parent_id] => 1
                    [logical_group] => 
                    [user_id] => 182
                    [GroupsUser] => Array
                        (
                            [id] => 226
                            [group_id] => 2
                            [user_id] => 46
                        )

                    [User] => Array
                        (
                            [id] => 182
                            [firstName] => Boss
                            [lastName] => Man
                            [ext] => 202
                        )
                )
        )
)

我尝试在 Groups 模型中访问一个类似命名的方法,但没有任何运气:

 public function findDepartments($user_id){
        $groups = $this->find('all', array(
            'conditions' => array(
                'Group.logical_group = 0'
            ),
            'contain' => array('User.id = ' . $user_id)
        ));
        return $groups;
    }

这将从返回的数据中删除 User 数组,但无论连接表 (groups_users) 是否匹配,它都会返回每个部门(组),并且只返回一个空的用户数组及其返回的数据。

我知道我可以简单地从我的用户模型的方法中使用这些数据并使用 Set 类来删除我不想要的东西,但这相当低效。必须有一种方法可以让 Group 模型正确地查询我正在寻找的内容,对吧?

-- 编辑/更新 -- 我已经取得了一些进展,但在这样做的过程中还有其他一些好处。

我现在findDepartment从 Group 模型中调用:

public function findDepartments($user_id) {
    $this->recursive = -1;

    $options['joins'] = array(
        array(
            'table' => 'groups_users',
            'alias' => 'GroupsUser',
            'type'  => 'INNER',
            'conditions' => array(
                'Group.id = GroupsUser.group_id'                    
            )
        )
    );
    $options['conditions'] = array(
        'Group.logical_group = 0',
        'GroupsUser.user_id = '.$user_id
    );
    $depts = $this->find('all', $options);
    return $depts;
}

这让我更接近我想要得到的数据:

Array
(
    [0] => Array
        (
            [Group] => Array
                (
                    [id] => 3
                    [name] => Adult Services
                    [parent_id] => 
                    [logical_group] => 
                    [user_id] => 38
                )
        )
    [1] => Array
        (
            [Group] => Array
                (
                    [id] => 9
                    [name] => Youth Services
                    [parent_id] => 
                    [logical_group] => 
                    [user_id] => 62
                )
        )
)

不幸的是,我在belongsTo这里失去了关联的用户关系。我试过在数组中添加一个辅助LEFT连接,但它似乎没有用。我不确定如何为 HABTM 创建它的连接来创建这样的结果......joinsUserContainable

4

0 回答 0