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()関数を使うことで対応できます。
こちらもおススメ
助かりました!