単に field パラメータに指定するだけではうまく動作しないので、一旦 find(‘all’) で結果を取得してから Set::combine を使って同等の構造を得る。
// user_id => 件数 $tmp = $Post->find('all', array('fields' => array('user_id', 'COUNT(*) AS posts_count'), 'group' => 'user_id')); return Set::combine($tmp, '{n}.Post.user_id', '{n}.0.posts_count');
Set::combine は恐ろしく多機能なので、find(‘list’) をそのまま使うよりずっと多くの事ができる。例えば次のように、複数カラムで GROUP BY した結果をフラットな配列にまとめることができる。
// "user_id:category_id" => 件数 $tmp = $Post->find('all', array('fields' => array('user_id', 'category_id', 'COUNT(*) AS posts_count'), 'group' => array('user_id', 'category_id'))); return Set::combine($tmp, array('{0}:{1}', '{n}.Post.user_id', '{n}.Post.category_id'), '{n}.0.posts_count');
値を連想配列にする事もできる。
// user_id => array("created_max" => 最大値, "created_min" => 最小値) $tmp = $Post->find('all', array('fields' => array('user_id', 'MAX(created) AS created_max', 'MIN(created) AS created_min'), 'group' => 'user_id')); return Set::combine($tmp, '{n}.Post.user_id', '{n}.0');