【Laravel 쿼리 빌더】1시간마다 groupBy하여 집계하는 방법

라라벨에서 시간별로 그룹화하고 집계하는 방법을 간략하게 설명합니다.

버전은 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을 부탁드립니다.

블로그에서 다음과 같은 기사도 쓰고 있습니다.

좋은 웹페이지 즐겨찾기