最初は非常に複雑な (構造の点で) SQL クエリを手動で CakePHP ですばやく作成しましたが、現在は CakePHP の find メソッドで実行するように書き直そうとしています。
$sql = "SELECT
`users`.`username`,
(SELECT ROUND(SUM(`divisions`.`amount`), 2)
FROM `purchases`
INNER JOIN `divisions`
ON `purchases`.`id` = `divisions`.`purchase_id`
WHERE `purchases`.`user_id` = `users`.`id`
AND `divisions`.`user_id` = `users`.`id`
AND `purchases`.`group_id` = " . $group_id . "
) AS `owed_to`
FROM `users`
INNER JOIN `memberships` ON `users`.`id` = `memberships`.`user_id`
INNER JOIN `groups` ON `memberships`.`group_id` = `groups`.`id`
WHERE `memberships`.`group_id` = " . $group_id . " AND
`users`.`id` != " . $user_id . ";";
SQL ではクエリ全体に WHERE フィルタを適用できるため、非常に簡単になります。Cake では、ただ行くことはできません:
$results = $this->User->find('all', array(
'conditions' => array(
'Membership.group_id =' => $id
),...
結合を設定しようとしました:
$joins = array(
array('table'=>'memberships',
'alias' => 'Membership',
'type'=>'inner',
'conditions'=> array(
'Membership.user_id = User.id', 'Membership.group_id' => $id)
),
これは再帰の単一レイヤーでは問題なく機能しますが、メンバーシップ (グループなど) に関連するモデルはフィルターの対象になりません。
完全に間違ったことをしているとしか思えません。
基本的に私は混乱しています。
さらなる情報
User => HasMany => Purchase, Membership, Division
Membership => BelongsTo => Group, User
Group => HasMany => Membership
Purchase => HasMany => Division
Purchase => BelongsTo => User, Group
Division => BelongsTo => Purchase, User