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()メソッドを使うなど、もっといい方法もあると思うのですが、動いたのでこの方法をそのまま利用しています。

何かアドバイスがあれば、教えていただきたいです。

終わりに

以上となります。

力技感が否めないですが、これで出ているので現状こう書いています。

何かもっと良い方法があったら教えていただきたいです。

ありがとうございました。