我正在尝试在CakePHP中使用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
)
)
)
)
我尝试在群组模型中访问类似命名的方法,但没有任何运气:
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创建连接以创建这样的结果......