我正在尝试在 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 创建它的连接来创建这样的结果......joins
User
Containable