LoginSignup
3
1

【PHP/Laravel】データを特定のグループごとに集計

Last updated at Posted at 2023-05-18

はじめに

データを特定のグループごとに抽出した上で、さらに合計したりなど集計処理を行いたい場合があると思います。
(実際、これまでの業務ではかなりありました!)

本記事では、そのやり方をまとめていきます。

開発環境・前提

開発環境

  • OS:Windows11 22H2
  • PHP 8.2.0
  • Laravel 9.44.0

前提

  • ローカルにLaravel開発環境があり、開発サーバーを起動済みであること。
  • テーブルが作成済みで、データが格納されていること(今回の例ではcreaturesテーブル)。
  • 対象はcreaturesテーブルのみであり、今回の例でリレーションは考慮しない。

【今回使用するcreaturesテーブルの中身】
スクリーンショット 2023-04-25 155212.png

手順

1. ルーティングを編集(今回の例ではデフォルトのルーティングを変更)。

web.php
Route::get('/', [App\Http\Controllers\Controller::class, 'sumCount']);

2. コントローラーを編集。

Controller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;

class Controller extends BaseController
{
    public function sumCount()
    {
        $collection = DB::table('creatures')->get();
        
        $groupBy = $collection->groupBy('class');

        $sumCount = $groupBy->map(function ($item) {
            return $item->sum('count');
        });

        return view('groupBy')->with('test', $sumCount);
    }
}

3. ブラウザでの確認用にgroupBy.blade.phpファイルを作成し、bodyタグ内に以下を追記。

groupBy.blade.php
<h1>{{ $test }}</h1>

4. http://localhost/に接続し、ブラウザで結果を確認。
スクリーンショット 2023-04-25 155510.png

解説(主にコントローラーの内容)

  • use Illuminate\Support\Facades\DB;
    クエリビルダを用いるため、DBクラスをuse宣言しています。

  • $collection = DB::table('creatures')->get();
    DB::table()の引数にテーブル名を指定し、そのテーブルのデータを取得しています。
    この戻り値はIlluminate\Support\Collectionのインスタンスであり、それを変数に格納しています。
    なお、今回は単純な例としてそのままget()で処理していますが、取得するデータ量が多い場合はメモリ不足に陥る可能性があるのでご注意ください。

  • $groupBy = $collection->groupBy('class');
    変数$collectionにはIlluminate\Support\Collectionのインスタンスが格納されているので、CollectionメソッドgroupBy()を活用でき、引数に指定したキーの値ごとにデータをまとめています。
    今回の例では、classキーにはanimal・fish・birdの3つの値があるので、3つのグループごとにデータがまとめられ、それらを変数に格納しています。

  • $sumCount = $groupBy->map(function ($item) { return $item->sum('count'); });
    変数$groupByに格納されたデータをCollectionメソッドmap()を使い、グループごとに処理しています。
    $item->sum('count')の部分でcountキーの値の合計値を算出しています。
    ここではanimal・fish・birdの各グループごとにcountの合計値が計算され、それらを変数に格納しています。

  • return view('groupBy')->with('test', $sumCount);
    withメソッドでbladeファイルgroupBy.blade.phpに値を渡しています。
    第1引数にbladeファイル上で用いる変数名、第2引数にコントローラー上で求めた合計値が格納された変数名を指定します。

最後に、コントローラーから渡された変数をbladeファイルで指定すれば作業完了です。
ブラウザで確認すると、animalの合計値が7、fishの合計値が11、birdの合計値が3ということが分かるはずです。

まとめ

クエリビルダを使えばデータ取得、Collectionを使えばデータの加工や集計が簡単にできます!
実際の開発でも使うことは多々あると思うので、今のうちに慣れておきましょう!

本記事が少しでも読者の皆様の参考になれば幸いです。

それでは良き開発ライフを!!

参考情報

Laravel公式

3
1
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
3
1