カテゴリ: Symfony 更新日: 2026/05/10

Symfony Doctrineでページネーション処理を完全ガイド!初心者でもわかるデータ分割の基本

Doctrineでデータのページネーション処理を行う方法
Doctrineでデータのページネーション処理を行う方法

先生と生徒の会話形式で理解しよう

生徒

「Symfonyで記事一覧を表示するときに、全部のデータを一度に表示するとページが重くなってしまいます。どうやって分割したらいいんですか?」

先生

「それはページネーションという方法を使います。ページごとにデータを小分けにして表示する仕組みのことですよ。」

生徒

「ページネーションって難しそうに聞こえますが、Doctrineでも簡単にできるんでしょうか?」

先生

「大丈夫です。Doctrineにはページネーション向けの仕組みが用意されていますし、Symfonyと組み合わせるともっと便利になります。まずはやさしく仕組みから説明しますね。」

1. ページネーションとは?初心者向けのわかりやすいイメージ

1. ページネーションとは?初心者向けのわかりやすいイメージ
1. ページネーションとは?初心者向けのわかりやすいイメージ

ページネーションとは、たくさんのデータを複数のページに分けて表示する仕組みのことです。インターネットのショッピングサイトで、商品一覧が「1ページ目・2ページ目」と並んでいるのを見たことがあると思います。これがページネーションです。

もしページネーションがなければ、数千件の商品が一気に読み込まれ、画面が重くなります。SymfonyのDoctrine ORMでも同じで、記事やユーザーなどのデータを全部読み込むとパフォーマンスが低下します。そこでDoctrineの仕組みを利用して、必要な分だけデータを取得する方法がとても重要になります。

初心者の方には「本を読むときに一度に全部のページを開かず、1ページずつ読むイメージ」と伝えると理解しやすくなります。

2. Doctrine ORMでページネーションを行う基本的な流れ

2. Doctrine ORMでページネーションを行う基本的な流れ
2. Doctrine ORMでページネーションを行う基本的な流れ

Doctrineでは、ページネーションを実現するために「どこから」「いくつ」取り出すかを指定します。これはSQLの世界では LIMIT と OFFSET と呼ばれる考え方です。SymfonyではRepository内で QueryBuilder を使い、ページごとに取得するデータを調整します。

ページネーションで必要なのは、次の2つです。

  • 取得する件数(limit)
  • どこから取得するか(offset)

例えば1ページ10件表示したい場合、1ページ目は0件目から、2ページ目は10件目から、3ページ目は20件目から取得する、といった計算になります。Doctrineはこの考え方を簡単に実装できるようになっています。

3. Repositoryクラスでページネーション処理を実装する

3. Repositoryクラスでページネーション処理を実装する
3. Repositoryクラスでページネーション処理を実装する

ここでは Doctrine の QueryBuilder を使ってページネーションを実装する基本形を紹介します。初心者の方は、細かい書き方よりも「ページごとにデータを分けている」というイメージを持つことが大切です。


<?php

public function findPaginated(int $page, int $limit): array
{
    $offset = ($page - 1) * $limit;

    return $this->createQueryBuilder('a')
        ->orderBy('a.id', 'DESC')
        ->setFirstResult($offset)
        ->setMaxResults($limit)
        ->getQuery()
        ->getResult();
}

この例では、ページ番号と表示件数から offset を計算し、その結果に応じてデータを分割して取得しています。Symfonyのコントローラ側でページ番号を渡して呼び出すことで、どのページ内容でも柔軟に表示できます。

4. カウント用クエリで総ページ数を計算する方法

4. カウント用クエリで総ページ数を計算する方法
4. カウント用クエリで総ページ数を計算する方法

ページネーションを行うときにもう一つ大切なのが「総ページ数の計算」です。総件数を知らないと「全部で何ページあるか」が分からず、ナビゲーションリンクが作れません。

Doctrineの QueryBuilder を使って総件数を取得する例は次の通りです。


public function countAll(): int
{
    return (int) $this->createQueryBuilder('a')
        ->select('COUNT(a.id)')
        ->getQuery()
        ->getSingleScalarResult();
}

COUNT は SQL の集計関数で、レコードの数量を数える仕組みです。この件数を limit で割ることで総ページ数が求められます。

5. コントローラでページネーション処理を呼び出す流れ

5. コントローラでページネーション処理を呼び出す流れ
5. コントローラでページネーション処理を呼び出す流れ

Repositoryでページネーションの準備が整ったら、Symfonyのコントローラで実際にデータを取得します。ページ番号をURLパラメータから受け取り、Repositoryに渡して処理するだけで実装できます。


$page = $request->query->getInt('page', 1);
$limit = 10;

$articles = $articleRepository->findPaginated($page, $limit);
$total = $articleRepository->countAll();
$totalPages = ceil($total / $limit);

このように、ページ番号を受け取り、総ページ数を計算すれば、Twigでページネーションリンクを作成できます。Symfonyアプリケーションでよく使われる基本的な流れです。

6. Doctrineページネーションを使うときの注意点と最適化の考え方

6. Doctrineページネーションを使うときの注意点と最適化の考え方
6. Doctrineページネーションを使うときの注意点と最適化の考え方

ページネーションは便利ですが、注意点もあります。特に大量のデータがある場合、COUNTクエリが時間のかかる処理になることがあります。これを避けるためにキャッシュを導入したり、データの取得範囲を絞るといった工夫が必要になる場合もあります。

また、ページネーションを行うときは、並び順(order by)を明確にしておくことが重要です。同じデータでも順番が毎回変わってしまうと、ユーザーがどこまで見たかわからなくなってしまうからです。

初心者の方はまず「何件表示するか」「どこから取得するか」の2つの仕組みをしっかり理解することが大切です。Doctrine ORMはこの考え方を柔軟に扱えるツールなので、ページネーションを導入するとアプリの使いやすさが大きく向上します。

まとめ

まとめ
まとめ

Symfony Doctrine ページネーション処理の重要ポイント

Symfony と Doctrine ORM を使った開発では データ一覧を表示する場面がとても多くあります。たとえば 記事一覧 ユーザー一覧 商品一覧 コメント一覧などです。これらのデータをすべて一度に表示すると データベースへの負荷が大きくなり ページの読み込み速度が遅くなる原因になります。その問題を解決するために重要になるのが ページネーション処理です。

ページネーションとは 大量のデータを一定の件数ごとに分割して表示する仕組みのことです。多くのウェブサイトでは 一覧ページの下に ページ番号が表示されており 次のページ 前のページ といったリンクをクリックすることでデータを切り替えて閲覧できます。この仕組みを Symfony と Doctrine ORM で実装することで データベース負荷を軽減しながら快適なユーザー体験を実現できます。

Doctrine を使ったページネーション処理の基本は 次の二つの考え方です。ひとつ目は 取得するデータの件数を指定することです。もうひとつは どこからデータを取得するかを指定することです。この二つを組み合わせることで 必要なデータだけを効率よく取得できます。

ページネーションの基本となる計算方法

ページネーションでは 現在のページ番号と表示件数をもとに 取得開始位置を計算します。たとえば 一ページあたり十件表示する場合 二ページ目は十一件目から 二十件目までを取得する必要があります。この開始位置を求める計算が offset です。


$page = 2;
$limit = 10;

$offset = ($page - 1) * $limit;

echo $offset;

10

このように 現在のページ番号から offset を計算することで Doctrine QueryBuilder の setFirstResult と setMaxResults を利用して必要なデータだけ取得できるようになります。これは Symfony Doctrine 開発において非常に基本となるテクニックです。

Doctrine Repository でページネーションを実装する例

Symfony のベストプラクティスでは データベース処理を Repository クラスにまとめる設計が推奨されています。ページネーション処理も Repository にメソッドとして実装しておくことで コントローラから簡単に呼び出すことができます。


public function findPaginatedArticles(int $page, int $limit): array
{
    $offset = ($page - 1) * $limit;

    return $this->createQueryBuilder('a')
        ->orderBy('a.id', 'DESC')
        ->setFirstResult($offset)
        ->setMaxResults($limit)
        ->getQuery()
        ->getResult();
}

このコードでは QueryBuilder を利用して 記事データをページ単位で取得しています。orderBy を指定することで 常に同じ順序でデータが表示されるようになります。ページネーションでは並び順がとても重要で 順番が変わってしまうとユーザーが閲覧した内容が分かりにくくなるため 必ず orderBy を指定するようにしましょう。

総ページ数を計算するための件数取得

ページネーションを作るときは 全体のページ数を計算する必要があります。総件数が分からなければ 最後のページがどこなのか判断できないためです。Doctrine では COUNT を使うことで総レコード数を取得できます。


public function countArticles(): int
{
    return (int) $this->createQueryBuilder('a')
        ->select('COUNT(a.id)')
        ->getQuery()
        ->getSingleScalarResult();
}

取得した総件数を表示件数で割ることで 総ページ数を求めることができます。これにより Twig テンプレートでページ番号リンクを作成することが可能になります。


$total = 95;
$limit = 10;

$totalPages = ceil($total / $limit);

echo $totalPages;

10

このように Symfony Doctrine ページネーションでは limit offset count の三つの概念を理解することが非常に重要です。これらを組み合わせることで 大量データを効率よく扱うアプリケーションを作ることができます。

ページネーション設計で意識しておきたいポイント

実際の開発では ページネーション処理を導入するだけでなく パフォーマンスやユーザー体験も意識する必要があります。たとえば 一ページあたりの表示件数が多すぎるとページが重くなりますし 少なすぎるとページ移動が増えてしまいます。多くのウェブサイトでは 十件から二十件程度の表示件数がよく使われています。

また データ件数が非常に多い場合は COUNT クエリが重くなることもあります。そのような場合には キャッシュの利用 検索条件の追加 インデックス設計など データベース最適化を行うことで パフォーマンスを改善できます。Symfony と Doctrine ORM を活用した開発では こうしたデータ取得戦略を理解しておくことが重要になります。

Symfony Doctrine ページネーションは 記事一覧 ブログ一覧 商品一覧 管理画面 ユーザー管理システムなど ほぼすべてのウェブアプリケーションで利用される基本技術です。今回学んだ Repository QueryBuilder limit offset count の考え方を理解しておけば 実務レベルの Symfony 開発でも十分に応用できるようになります。

先生と生徒の振り返り会話

生徒

今日は Symfony Doctrine のページネーション処理について学びましたが 一番大事なポイントはどこでしょうか

先生

一番大切なのは 大量データを一度に取得しないことです 必要な件数だけ取得することで アプリケーションのパフォーマンスを大きく改善できます

生徒

つまり limit と offset を使って データを分割して取得することが重要なのですね

先生

その通りです さらに Repository にページネーション処理をまとめておくと コントローラがすっきりして Symfony アプリケーションの設計もきれいになります

生徒

総ページ数を計算するために COUNT クエリも必要でしたね

先生

よく覚えていますね Symfony Doctrine ページネーションでは limit offset count の三つを理解することが基本です この仕組みを理解しておけば 記事一覧や商品一覧など多くの画面を効率よく作れるようになります

生徒

Symfony の実務開発でもよく使われる技術なので しっかり復習しておきます

先生

その姿勢が大切です Symfony Doctrine QueryBuilder Repository ページネーション処理はウェブアプリケーション開発の基礎なので 実際にコードを書いて何度も試してみてください

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルーティングでサブドメインを使う方法!初心者向けにやさしく解説
New2
Laravel
Laravelでマルチ言語ルートを設定する方法!ロケールごとのprefixで簡単管理
New4
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.2
Java&Spring記事人気No2
Symfony
SymfonyのRemember Me機能を完全解説!初心者でもわかるログイン保持の仕組み
No.3
Java&Spring記事人気No3
Laravel
Laravelでルートに中間処理を追加する方法!ミドルウェア活用ガイド
No.4
Java&Spring記事人気No4
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)
No.5
Java&Spring記事人気No5
Laravel
Laravelでドメインルートを使う方法!マルチドメイン対応を初心者向けに解説
No.6
Java&Spring記事人気No6
Laravel
LaravelのFeatureテストとUnitテストの違いを理解しよう
No.7
Java&Spring記事人気No7
CodeIgniter
CodeIgniterで多言語対応(Language)を徹底解説!言語切り替え機能を実装
No.8
Java&Spring記事人気No8
CodeIgniter
CodeIgniterでファイルアップロードとストレージ管理をマスター!初心者向け完全ガイド