[Laravel]Eloquentでsum()を使うと、stringが返される

カテゴリ: Laravel, MySQL, PHP

LaravelのEloquentでsum()やavg()の集計関数を使うと、結果が数字でなく文字列で返ってきます。

$totalScore = UserScore::where('team_id', $teamId)->sum('get_point');
\Log::info(json_encode($totalScore));    // "10" (10ではなく文字列の"10"になる)

このようにDB::raw()を使っても文字列で返ります。

DB::raw("SUM(get_point) as user_scores")

原因

これはLaravelの不具合ではなくMySQL/PHPの仕様です。

MySQLのマニュアルを見ると、sum()とavg()関数はDECIMAL形を返すと記載があります。

https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html

For numeric arguments, the variance and standard deviation functions return a DOUBLE value. 
The SUM() and AVG() functions return a DECIMAL value for exact-value arguments (integer or DECIMAL), 
and a DOUBLE value for approximate-value arguments (FLOAT or DOUBLE).

PHPはDECIMALをstringとして扱うので、結果としてEloquentの該当する関数もstringを返します。

これをSQLのレベルで修正したい場合は、CAST(SUM(get_point) AS INTEGER)のようにcast()関数を使うことで対応できます。


Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

One thought on “[Laravel]Eloquentでsum()を使うと、stringが返される

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です