countやsumを使う時のフィールド名を指定する
開発環境:CakePHP2.5.1
CakePHPでcountやsumなどを使う場合、ちょっとした工夫が必要になります。
group byを使う
countやsumなどを利用する場合で、各グループごとの集計をしたい時には、group byを指定します。
<?php $params = array( 'fields' => array( 'count(area_id)', ), 'group' => array( 'area_id', ), );
このようにすると、次のような結果が返ってきます。
Array ( [0] => Array ( [0] => Array ( [count(id)] => 2 ) ) [1] => Array ( [0] => Array ( [count(id)] => 3 ) ) )
返り値のモデル名を指定
上記の例のようにすると、モデル名が入る部分に「0」が入っていて、その後の処理が少しやり難くなります。
そこで使うのが、virtualFields。
<?php class Sample extends AppModel { public $virtualFields = array('cnt' => 0); public function getList() { $params = array( 'fields' => array( 'count(id) AS Sample__cnt', ), 'group' => array( 'area_id', ), ); return $this->find('all', $params); } }
virtualFieldsでcntというフィールド名を指定し、count部分に別名として「モデル名__フィールド名」を指定します。
そうすると結果は次のようになります。
Array ( [0] => Array ( [Sample] => Array ( [cnt] => 2 ) ) [1] => Array ( [Sample] => Array ( [cnt] => 3 ) ) )
これで他のフィールドと同じように扱うことができますね。