6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravelクエリビルダ】groupByとCOUNT関数で集計する方法

Last updated at Posted at 2021-07-10

LaracelでgroupByとCOUNT関数を使ってデータを取得する方法を解説します。

バージョンは6系

ブログで以下のような記事も書いています。

ゴール

postsテーブルにあるuser_idをグループ化させてuser_idをCOUNT関数でカウントする。

イメージは以下です。
postsテーブル

post_id user_id
1 1
2 2
3 3
4 1

ユーザーID ユーザーIDのカウント
1 2
2 1
3 1

やり方としては、
・postsテーブルにあるuser_idをグループ化
・user_idをCOUNT関数を使ってカウントする
・ビューで表示

サンプルコード

DB::table('posts')
  ->select('user_id')
  ->selectRaw('COUNT(user_id) as count_userId')
  ->groupBy('user_id')
  ->get();

selectRawはselect(DB::raw)の省略形です。selectRaw('COUNT(user_id)でuser_idをカウントしています。

COUNTやSUM関数は、select('COUNT()')とできないので注意。

groupByでuser_idをグループ化させています。

ビューでforeachを回せばデータを取得できます。

<table>
    <thead>
      <tr>
        <th>ユーザーID</th>
        <th>ユーザーIDのカウント</th>
      </tr>
    </thead>
    <tbody>
    // $resultsの中にデータを先程のロジックデータを格納しています。
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->user_id }}</td>
        <td>{{ $result->count_userId }}</td>
      </tr>
    @endforeach
    </tbody>
</table>

コード全文

モデル(Post.php)

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;←忘れずに追記する。

class Post extends Model
{
    public function getCountAmount()
    {
      return DB::table('posts')
              ->select('user_id')
              ->selectRaw('COUNT(user_id) as count_userId')
              ->groupBy('user_id')
              ->get();
    }
}

コントローラー(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->getCountAmount();

        return view('posts.index', compact(
            'results',
        ));
    }
}

ビュー(index.blade.php)

<table>
    <thead>
      <tr>
        <th>ユーザーID</th>
        <th>ユーザーIDのカウント</th>
      </tr>
    </thead>
    <tbody>
    @foreach ($results as $result)
      <tr>
        <td>{{ $result->user_id }}</td>
        <td>{{ $result->count_userId }}</td>
      </tr>
    @endforeach
    </tbody>
</table>

もしわからない箇所があればどしどしご質問ください!
参考になったと思ったら忘れずに記事のストックまたはLGTMをお願いいたします。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?