かなり奇妙なシナリオで、CakePHP で Containable を使用しようとしています。
- グループ hasAndBelongsToMany ユーザー
- グループの属しているユーザー
- ユーザー hasAndBelongsToMany グループ
よくわかりませんが、クエリに何か問題があるか、Containable が自分の条件で参照しようとしている「ユーザー」を自動的に判断するのに苦労していると考えています。(部門には部門長がいて、グループはユーザーに属しています。部門は HABTM の従業員でもあり、その逆も同様です。したがって、2 つの 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;
}
これにより、返されたデータからユーザー配列が削除されますが、結合テーブル (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
ここで関連する User 関係を失いました。に配列の二次LEFT
結合を追加しようとしましたが、うまくいかないようです。このような結果を作成するために HABTM の結合を作成する方法がわかりません...joins
User
Containable