データベースからデータを取得するときにGROUP BYでCOUNT(*)を取得するときって結構多いと思うけど、
普通に取得しようとすると配列に変な形式で値が入ってしまう。
で、AppModelの中にafterFindを定義して自力で変更してねという方法を試した。
コントローラ
$data = $this->Hoge->find('all', array( 'fields'=> array('id', 'name', 'count(*) as cnt'), 'group' => array('name'), ));
取得結果はこんな感じになるのでいけてない。
Array ( [0] => Array ( [Hoge] => Array ( [id] => 2 [name] => HogeHoge ) [0] => Array ( [cnt] => 3 ) ) [1] => Array ( [Hoge] => Array ( [id] => 3 [name] => Hoge ) [0] => Array ( [cnt] => 1 ) ) )
で、以下に書いてあるようにModelのafterFindを使って自力でやれよとあったので試してみたら何とか行けた。
http://nuts-and-bolts-of-cakephp.com/2008/09/29/dealing-with-calculated-fields-in-cakephps-find/
AppModelの中にこんな感じでafterFindを定義する
<?php class AppModel extends Model { function afterFind($results, $primary=false) { if($primary == true) { if(Set::check($results, '0.0')) { $fieldName = key($results[0][0]); foreach($results as $key=>$value) { $results[$key][$this->alias][$fieldName] = $value[0][$fieldName]; unset($results[$key][0]); } } } return $results; } } ?>
コントローラの変更は特に必要なくこれでさっきよりましになる。
これでいいのか分からないけどとりあえずOKとしておこう。