CakePHP包含Fat Model,Skinny Controller

时间:2013-10-03 17:23:48

标签: cakephp model containable

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

  • Group hasAndBelongsToMany User
  • 群组属于用户
  • User hasAndBelongsToMany Group

我很不确定,但要么我的查询中有错误,要么我认为或许可以包含自动确定哪些“用户”我试图在我的条件中引用的困难时间。 (一个部门有一个部门主管,因此该集团属于用户。一个部门也是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
                        )
                )
        )
)

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

 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)是否匹配,只返回一个空的用户数组以及它返回的数据

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

- 编辑/更新 - 我已经取得了一些进展,但长期以来还有其他一些好处。

我现在从群组模型中调用findDepartment

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数组中的辅助joins联接添加到User,但似乎无效。我不确定Containable如何为HABTM创建连接以创建这样的结果......

0 个答案:

没有答案