2

私のアプリケーションのデータモデル

  • グループhasManyユーザー
  • ユーザーbelongsToGroup
  • ユーザーhasManyPunch
  • パンチbelongsToユーザー
  • パンチはPayPeriodに属します
  • PayPeriodには多くのパンチがあります

電話を探す

$groups = $this->Group->find('all', array( 'contain' => array(
    'User' => array(
        'Punch' => array(
            'conditions' => array(
                'Punch.payperiod_id' => null
            )
        )
    )

)));

クエリデバッグ

SELECT `Group`.`id`, `Group`.`name` 
FROM `pclock`.`groups` AS `Group` 
WHERE 1 = 1 ORDER BY `name` ASC

SELECT `User`.`id`, `User`.`name`, `User`.`group_id` 
FROM `pclock`.`users` AS `User` 
WHERE `User`.`group_id` IN (4, 3, 5, 2, 1)

SELECT `Punch`.`id`, `Punch`.`user_id`, `Punch`.`time_in`, `Punch`.`time_out`, `Punch`.`payperiod_id` 
FROM `pclock`.`punches` AS `Punch` 
WHERE `Punch`.`payperiod_id` IS NULL AND `Punch`.`user_id` IN (1, 2, 3, 4, 5)

アプリケーションが数千のパンチを持つ数百のユーザーに拡張されると、これらのクエリは非常に非効率になる可能性があります。Containableが次のクエリを実行することを期待します。

私が好むクエリ

SELECT 
    Group.id, Group.name, 
    User.id, User.name, User.group_id, 
    Punch.id, Punch.user_id, Punch.time_in, Punch.time_out, Punch.payperiod_id 
FROM groups AS Group
LEFT JOIN users AS User 
    ON (Group.id = User.group_id)
LEFT JOIN punches AS Punch 
    ON (User.id = Punch.user_id)
WHERE Punch.payperiod_id IS NULL

これを最適化する方法はありますか?options配列のjoin属性は無視されているように見え、Containableを使用せずに手動で結合を実行すると、階層的ではない結果が返されます。

4

2 に答える 2

2

これが、封じ込めがどのように機能するかです。検索で結合パラメータを使用するか、結合を実行するリンク可能な動作を検索できます。

https://github.com/rafaelbandeira3/linkable

于 2012-05-09T22:34:38.737 に答える
2

手動で参加できます:

$groups = $this->Group->find('all', array(
    'fields'=>array(
        'Group.id', 'Group.name', 'User.id', 'User.name', 'User.group_id', 
        'Punch.id', 'Punch.user_id', 'Punch.time_in', 'Punch.time_out',
        'Punch.payperiod_id'
    ),
    'conditions'=>array(
        'Punch.payperiod_id IS NULL'
    ),
    'joins'=>array
        array(
           'table'=>'users',
           'alias'=>'User',
           'conditions'=>array(
               'Group.id = User.group_id'
           )
        ),
        array(
            'table'=>'punches',
            'alias'=>'Punch',
            'conditions'=>array(
                'User.id = Punch.user_id'
            )
        )
    )
));
于 2012-05-10T16:13:29.577 に答える