私のアプリケーションのデータモデル
- グループ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を使用せずに手動で結合を実行すると、階層的ではない結果が返されます。