laravelで1時間ごとにグループ化させて集計する方法を簡単に解説します。
バージョンは6系です。
ブログで以下のような記事も書いています。
ゴール
時間 | 合計 |
---|---|
12:00〜12:59 | 200 |
15:00〜15:59 | 300 |
19:00〜19:59 | 500 |
準備
postsテーブル
post_id | amount | created_at |
---|---|---|
1 | 100 | 2021-06-01 12:23:07 |
2 | 200 | 2021-06-15 15:23:23 |
3 | 300 | 2021-06-30 16:21:12 |
4 | 400 | 2021-07-21 19:23:32 |
5 | 200 | 2021-07-27 15:04:56 |
ここから、created_atの時間でグループ化させて合計値を出します。
考え方
HOUR関数を使用することで、時刻から時を取り出すことができます。
サンプルコード
モデル(Post.php)
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;←忘れず記載する
class Post extends Model
{
public function getAmountByHour()
{
return DB::table('posts')
->selectRaw('HOUR(created_at) AS time')
->selectRaw('SUM(amount) as total_amt')
->groupBy('time')
->get();
}
}
selectRaw
はselect(DB::raw)の短縮系です。HOUR関数で2021-06-08 12:34:55
の12時を取り出すことができます。
あとは時間でグループ化させれば集計できます。
コントローラー(PostController.php)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;←バージョン8系なら use App\Models\Post;
class PostController extends Controller
{
public function index()
{
$this->posts = new Post();
$results = $this->posts->getAmountByHour();
return view('posts.index', compact(
'results',
));
}
}
ビュー(index.blade.php)
<table>
<thead>
<tr>
<th>日付</th>
<th>合計</th>
</tr>
</thead>
<tbody>
@foreach ($results as $result)
<tr>
<td>{{ $result->time }}:00〜{{ $result->time }}:59</td>
<td>{{ $result->total_amt }}</td>
</tr>
@endforeach
</tbody>
</table>
$resultsにはモデルで取得したデータがコレクション型で格納されています。なので、foreachで取り出しましょう。
以下のようにデータが取得できました。
今回は、時間でグループ化させる方法を見てきました。
このほかにも私の記事でlaravelのクエリビルダを解説しているので、ぜひ他の記事も見てくださいね!
記事が参考になったら、ストックかLGTMをお願いいたします。
ブログで以下のような記事も書いています。