Help us understand the problem. What is going on with this article?

CakePHP4 クエリビルダでの AVG と ROUND のやり方

AVG で平均を取った後の、小数点以下の四捨五入についてのコードが公式含め見当たらなかったので書き残しておきます。MySQL前提です。

例えば以下の要件を満たす場合です。

  • 商品の評価の平均値
  • 小数点第一位で四捨五入したい

コード

        $query = $this->Products->find();
        $result = $query
            ->select([
                'average_evaluation_rating' => $query->func()->round([$query->func()->avg('Products.evaluation'), 1]),
            ])
(以下略)

解説

MySQLだと以下のように書くところを

ROUND(AVG(Products.evaluation), 1)

CakePHP4 だと以下のように書きます。

$query->func()->round([roundしたい内容, 四捨五入する小数点の位置])

AVG も関数を使って書くべきなので、round したい内容に

$query->func()->avg('Products.evaluation')

と書いています。

実行されるクエリ

SELECT 
    (round(AVG(Products.evaluation), '1')) AS average_evaluation_rating
FROM
    products Products
(以下略)
mamy1326
サーバーサイドエンジニア。今はバックエンドっていうのかい?大層な名だね!(以下略) MySQLだいすき。 http://cune.jp だいすき。
lancers
テクノロジーで誰もが自分らしく働ける社会をつくる。日本最大級のクラウドソーシング「ランサーズ」を運営
https://www.lancers.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away