Laravelでのgroupbyとcountの使用方法


  1. モデルクエリビルダを使用したgroupbyとcountの基本的な使い方:
$posts = DB::table('posts')
            ->select('category', DB::raw('count(*) as total'))
            ->groupBy('category')
            ->get();
foreach ($posts as $post) {
    echo $post->category . ': ' . $post->total . '件';
}

上記のコードでは、'posts'テーブルからカテゴリごとの投稿数を取得しています。selectメソッドで'category'カラムとcount(*)を選択し、groupByメソッドで'category'カラムでグループ化しています。結果はgetメソッドで取得され、foreachループで表示されます。

  1. Eloquentモデルを使用したgroupbyとcountの利用:
class Post extends Model
{
    protected $table = 'posts';
    public function scopeGroupByCategory($query)
    {
        return $query->select('category', DB::raw('count(*) as total'))
                     ->groupBy('category');
    }
}
$posts = Post::groupByCategory()->get();
foreach ($posts as $post) {
    echo $post->category . ': ' . $post->total . '件';
}

上記のコードでは、Eloquentモデルを使用して同じ結果を得ることができます。PostモデルにgroupByCategoryスコープを追加し、その中でselectとgroupByを定義しています。Post::groupByCategory()を呼び出すことで、カテゴリごとの投稿数を取得できます。

  1. リレーションを使用したgroupbyとcountの利用:
class Category extends Model
{
    protected $table = 'categories';
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
$categories = Category::withCount('posts')->get();
foreach ($categories as $category) {
    echo $category->name . ': ' . $category->posts_count . '件';
}

上記のコードでは、CategoryモデルとPostモデルのリレーションを使用して、カテゴリごとの投稿数を取得しています。withCountメソッドを使用してリレーション先の投稿数をカウントし、結果はposts_count属性として利用できます。

これらはLaravelでgroupbyとcountを使用してデータを集計するいくつかの方法の例です。必要に応じて、これらの例を参考にして独自の要件に合わせてカスタマイズすることができます。