前提
以下のテーブルがあったとします。
training_name | training_time |
---|---|
ベンチプレス | 11:50:00 |
ベンチプレス | 01:40:00 |
期待する値
上記のテーブルのtraining_timeはTIME型です。
合計値として取得する期待値は 13:30:00 です。
失敗する方法
しかし、以下のようにシンプルにsumで取得すると、残念ながら期待する値とはならず、
129000 となってしまいます。
$training_time = Training::where('training_name', 'ベンチプレス')->sum('training_time');
dd($training_time);
解決方法
以下のように、MySQLのTIME_TO_SEC関数で一度秒に変換することで期待する集計結果を取得することが可能です。
秒に変換 -> 集計 -> 時間に変換 の順で処理をしています。
なお、selectRawを使うことでLaravelで自由なSQLを記述することが可能です。
$training = Training::selectRaw('SEC_TO_TIME(SUM(TIME_TO_SEC(training_time))) as total_time')
->where('training_name','ベンチプレス')
->first();
dd($training->total_time);
TIME型ってクセがありますね。。。