doctrine-fetch-modes について
SymfonyとDoctrine向けに、フェッチ戦略の選択と読み取りクエリの設計を支援する開発スキルです。フェッチ結合、DTOへの投影、DBAL 4のメソッドでN+1クエリや過剰取得を抑えます。
主な機能
- 01N+1クエリの診断
- 02関連のフェッチモード選択
- 03必要なデータをフェッチ結合で取得
- 04読み取り結果をDTOへ投影
- 05DBAL 4のクエリメソッドの利用
活用シーン
- 01N+1クエリが発生する一覧エンドポイントの修正
- 02読み取り専用リストで必要な列だけ取得
- 03大規模コレクションのフェッチ方式選択
- 04DBAL 4によるレポートクエリの作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill doctrine-fetch-modesインストール後、Claude Code で/doctrine-fetch-modesを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
Doctrine のフェッチモード(Symfony)
使用する場面
- リストまたは詳細エンドポイントが、関連に対して行ごとに 1 つのクエリを実行している(N+1 問題)。
- 読み取り専用のリストで、管理対象エンティティ全体ではなく、いくつかのカラムだけが必要な場合。
- マッピングで
LAZY、EAGER、EXTRA_LAZYのいずれを選ぶか検討している場合、またはPARTIALオブジェクトに依存する ORM 2 のコードを移植する場合。 - レポートまたはプロジェクションクエリが DBAL 4 経由で生の SQL に切り替わる場合。
デフォルトのワークフロー
- マッピングを変更する前に、Symfony プロファイラーで N+1 問題または過剰なデータ取得を確認します。
- 関連は
fetch: 'LAZY'のままにし、大きなコレクションにはfetch: 'EXTRA_LAZY'を設定して、count()、contains()、slice()が対象を絞った SQL を実行するようにします。 - リポジトリでフェッチ結合(
addSelect()とleftJoin())を使い、ユースケースで必要な関連を読み込みます。 - 読み取り専用のリストでは、
SELECT NEWを使ってreadonlyDTO にプロジェクションします(コンストラクター引数の順序はNEWリストと一致させる必要があります)。 - 結果を表示するだけ、または ID で検索するだけの場合は、
Query::HINT_READ_ONLYまたはインデックス付きエイリアス(createQueryBuilder('p', 'p.id'))を使います。 - 生の SQL には、DBAL 4 のメソッド(
fetchAllAssociative()、fetchOne()、executeStatement())を使います。
ガードレール
- DQL の
PARTIALは ORM 3.0~3.2 では失敗し、3.3 以降でのみ結果を返します。代わりに、読み取り専用リストにはSELECT NEWDTO を使います。 - マッピングでの
fetch: 'EAGER'は避けます。クエリのフェッチ結合で、ユースケースごとに同じ結果を得られます。 SELECT NEWが返すのは DTO であり、管理対象エンティティではありません。変更したり、フラッシュしたりしないでください。- DBAL 4 では
query()、exec()、fetchAll()が削除されています。
段階的な情報開示
- 実行時の方針とリスク管理には、このファイルを使用します。
- 実装の詳細が必要な場合は、リファレンスを開きます。
出力要件
- ユースケースごとにフェッチ戦略を選択したリポジトリメソッド。
- DTO クラスと、それらに値を設定する
SELECT NEWクエリ。 - プロファイラーまたは
doctrine:query:dql --show-sqlで確認した変更前後のクエリ数。
リファレンス
reference.md
コメント
Markdown 対応