得られる結果は、CakePHPが生成するものとほぼ同じです。
これを単純化するには、 Set ::combine> アレイのインデックスを再作成します。
$data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
を呼び出す必要があります。
これにより、年齢をインデックスとしてカウントし、値としてカウントする配列が返されます。
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
配列に深みがある理由は、計算フィールドを使用していない場合、cakeがモデルを内部配列のキーとして使用するため、複数のモデルをフィールドとして入力すると、それらが異なる配列に分割されるためです。計算フィールドを使用すると、同じ構造が維持されますが、モデルがわからないため、一般的な配列に配置する必要があります。
したがって、男性/女性でもグループ化する必要があり、計算フィールドではないUser.sexフィールドがあるとします。
$data = $this->User->find('all', array(
'fields' => array(
"User.sex"
"DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
'COUNT(User.id) AS [count]' // n.b. you have to give aliases normally
),
'group' => 'age', 'User.sex'
));
これは(次のような)戻ります:
Array
(
[0] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 4
[count] => 1
)
)
[1] => Array
(
[User] => Array
(
[sex] => Female
)
[0] => Array
(
[age] => 10
[count] => 1
)
)
[2] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 10
[count] => 1
)
)
)
したがって、一貫性を保つために、計算フィールドのみを使用する場合でも、余分な深さは常に存在します