Otrzymane wyniki są prawie najlepsze, jakie daje CakePHP.
Aby to uprościć, użyj Set::combine który ponownie indeksuje twoją tablicę.
Musisz zadzwonić $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');
Zwróci to tablicę z indeksem wieku i wartością:
Array
(
[9] => Array
(
[COUNT(id)] => 1
)
[10] => Array
(
[COUNT(id)] => 1
)
...
)
Powodem dodatkowej głębi w tablicy jest to, że Cake używa modelu jako klucza dla tablicy wewnętrznej, jeśli nie używasz pól obliczeniowych, dzięki czemu możesz umieścić wiele modeli jako pola i zostaną one podzielone na różne tablice. Kiedy używasz pól obliczanych, zachowuje tę samą strukturę, ale nie zna modelu, więc musi umieścić go w ogólnej tablicy.
Powiedzmy, że chcesz pogrupować według mężczyzn/kobiet i masz pole User.sex, które nie jest polem obliczeniowym.
$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'
));
To by wróciło (coś w stylu):
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
)
)
)
Dlatego dla spójności dodatkowa głębia jest zawsze dostępna, nawet jeśli używasz tylko pól obliczeniowych