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をお願いいたします。