CakePHP3でカラムの合計値を出したい
何か集計をしたいとかで合計値を出したい場合ってありますよね。
自分のサービスは採点が1つの機能だったので、使用する場面がありました。
個人的に結構悩んだ部分でもあります。
コントローラ(裏側)とビューテンプレートでの表示(表側)で処理をする必要があります。
そういった時の書き方をご説明します。
【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7
コントローラの書き方
Gradesというのは採点という意味で使っています。
採点テーブルがあり、これはその点数の合計を出す場面です。
一旦、コードだけ書くと以下のようになります。
// 合計点数を出すクエリ $sum_query = $this->Grades->find('all',[ 'conditions'=>['Grades.photo_id'=>$photo_id] ])->select([ 'sum'=>'SUM(Grades.grade)' ]); $this->set(compact('sum_query'));
findによってクエリという命令文のようなものが生成されます。
これをtoArray()メソッドなどで配列に直すことで、実際の値が表示できます。
上記ではまず変数sum_queryに格納しています。
conditionsで条件を絞り込み、selectの部分である処理をしています。
それは矢印のあとを「'SUM(Grades.grade)'」としていることです。
こうすることでSUM(合計値を出すSQLの集計関数)をしてやっています。
最後にset(compact(云々))でビューテンプレートに値を渡しています。
ここまでがコントローラでの処理です。
ビューテンプレートでの表示処理
今度はビューテンプレートです。
<?php $sum_array = $sum_query->toArray() ?> <?= $sum_array[0]->sum ?>
先ほどの変数sum_queryはクエリなので、まずtoArray()メソッドで配列にします。
そしてここは力技なのですが、変数sum_arrayの0番目(1番最初の配列)の項目sumの値を取り出します。
これでGradesテーブルの採点の合計が表示できます。
正直、結構ここは個人的に悩んだところで、効率の良いコードではないですし、もっと綺麗なコードがあると思います。
sum()メソッドを使うなど、もっといい方法もあると思うのですが、動いたのでこの方法をそのまま利用しています。
何かアドバイスがあれば、教えていただきたいです。
終わりに
以上となります。
力技感が否めないですが、これで出ているので現状こう書いています。
何かもっと良い方法があったら教えていただきたいです。
ありがとうございました。