I risultati che ottieni sono praticamente i migliori prodotti da CakePHP.
Per semplificare dovresti usare Set::combine che reindicizza il tuo array.
Dovresti chiamare $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
Ciò restituirebbe una matrice con età come indice e conteggiata come valore:
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
Il motivo della maggiore profondità nell'array è che cake utilizza il modello come chiave per l'array interno se non si utilizzano campi calcolati, in modo da poter inserire più modelli come campi e verranno suddivisi in array diversi. Quando usi i campi calcolati, mantiene la stessa struttura, ma non conosce il modello, quindi deve inserirlo in un array generale.
Quindi supponiamo che tu voglia raggruppare anche per maschio/femmina e hai un campo User.sex, che non è un campo calcolato.
$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'
));
Questo restituirebbe (qualcosa come):
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
)
)
)
Quindi, per coerenza, la profondità extra è sempre presente anche se utilizzi solo campi calcolati