1

最初は非常に複雑な (構造の点で) 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
4

1 に答える 1

0

次のように記述できます。

$results = $this->User->find('all', array(
  'conditions' => array(
    'Membership.group_id' => $id
),...

ユーザーが多くのメンバーシップを持ち、メンバーシップがユーザーに属し、$this->User->recursive = 1 の場合、動作するはずです

于 2013-01-15T14:40:25.043 に答える