Резултатите, които получавате, са почти най-добрите, които 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
)
)
)
По този начин за последователност допълнителната дълбочина винаги е налице, дори ако използвате само изчислени полета