Výsledky, které získáte, jsou v podstatě ty nejlepší, které CakePHP produkuje.
Pro zjednodušení byste měli použít Set::combine který přeindexuje vaše pole.
Budete muset zavolat $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
To by vrátilo pole s věkem jako indexem a počítat jako s hodnotou:
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
Důvodem extra hloubky pole je to, že koláč používá model jako klíč pro vnitřní pole, pokud nepoužíváte vypočítaná pole, takže můžete vložit více modelů jako pole a ty budou rozděleny do různých polí. Když použijete vypočítaná pole, zachová si stejnou strukturu, ale nezná model, takže jej musí vložit do obecného pole.
Řekněme tedy, že chcete seskupit také podle mužského/žena a máte pole User.sex, což není vypočítané pole.
$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'
));
Toto by se vrátilo (něco jako):
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
)
)
)
Pro konzistenci je tedy hloubka navíc vždy k dispozici, i když používáte pouze vypočítaná pole