たとえばこんな$this->find()
を記述したとする。
<?php $this->find('all', array( 'fields' => array( 'name', 'count(name) as idCount' ), 'group' => array( 'name' ) ));
とあるModelでname
をグルーピングしてそれぞれ合計を数えるSQLを発行してくれる。
んで、結果はこれだ。
Array ( [0] => Array ( [Model] => Array ( [name] => 名前 ) [0] => Array ( [idCount] => 8 ) ) )
キモい。。。。。なんだこれ?
これはさすがにつかえないので、組み換えが必要である。外人さんのサイトが参考になった。
どうやらAppModel.php
で、afterFind()
をOverrideすればいいっぽい
- ~/app/Model/AppModel.php
<?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; } }
ごちゃごちゃしていて見づらいですが、afterFind()
は、findから返された結果を変更するため用意されているコールバックメソッドです。
んで、Set::check()
で配列$results
に特定の配列パス'0.0'
がセットされているか調べるCakePHPのClassです。
ここまで条件が通れば、あとはキモいところの配列を修正してArray([0][Model])
の箇所に入れる処理ですね。
すると。
Array( [0] => Array ( [Model] => Array ( [name] => 名前 [idCount] => 8 ) ) )
すごくきれいになりました。ヾ(´∀`)ノキャッキャ