[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()関数を使うことで対応できます。

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。