De resultater, du får, er stort set de bedste, som CakePHP producerer.
For at forenkle dette bør du bruge Set::combine som genindekserer dit array.
Du skal kalde $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
Dette ville returnere en matrix med alder som indeks og tælle som værdien:
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
Grunden til den ekstra dybde i arrayet er, at cake bruger modellen som nøglen til det indre array, hvis du ikke bruger beregnede felter, så du kan indsætte flere modeller som felter, og de vil blive opdelt i forskellige arrays. Når du bruger beregnede felter, beholder den den samme struktur, men kender ikke modellen, så den skal placeres i et generelt array.
Så lad os sige, at du også vil gruppere efter mand/kvinde, og du har et User.sex-felt, som ikke er et beregnet felt.
$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'
));
Dette ville returnere (noget i stil med):
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
)
)
)
Derfor er den ekstra dybde der altid, selvom du kun bruger beregnede felter