doctrine-relations について
SymfonyとDoctrineでエンティティ関連をマッピングし、永続化の動作を管理する開発スキルです。所有側の選択、カスケード、孤児削除、コレクション読み込み、複数のエンティティマネージャーを扱います。
主な機能
- 01所有側と逆側のマッピング
- 02双方向コレクションの同期
- 03カスケードと孤児削除の選択
- 04大規模コレクションとフェッチ結合への対応
- 05複数エンティティマネージャーの利用
活用シーン
- 01Doctrineの関連を新たにマッピング
- 02永続化されない関連の修正
- 03子エンティティの削除方法の選択
- 04複数エンティティマネージャー間でのリポジトリ取得
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill doctrine-relationsインストール後、Claude Code で/doctrine-relationsを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
Doctrine の関連(Symfony)
使用する場面
ManyToOne、OneToMany、ManyToMany、OneToOneをマッピングし、所有側を選択するとき。- 子エンティティに
cascadeとorphanRemovalのどちらを使うか決めるとき。 - 関連が永続化されない(逆側だけを設定している)、または大きな逆側コレクションで
contains()が遅いとき。 - 複数のエンティティマネージャーにエンティティを分けるとき。
デフォルトのワークフロー
- 所有側(外部キーを保持する、
inversedByを指定したManyToOne)と、逆側(mappedByを指定したOneToMany)を選びます。 - コンストラクターで
ArrayCollectionを使ってコレクションを初期化し、両側の整合性を保つaddX()とremoveX()ヘルパーを作成します。 - 集約をまとめて保存する場合は
cascade: ['persist']を使用し、真のコンポジションに限ってorphanRemoval: trueを使用します。 - 大きな逆側コレクションには
fetch: 'EXTRA_LAZY'を指定するか、所有側からメンバーシップをテストします。 - ユースケースで関連を読み取る場合は、N+1 クエリを避けるためにフェッチ結合を追加します。
- 複数のエンティティマネージャーを使う場合、各エンティティセットを単一のマネージャーにまとめ、
ManagerRegistryを通じてリポジトリを取得します。
ガードレール
- Doctrine が永続化するのは所有側が保持する内容です。必ず
ManyToOneの参照を設定してください。 - 大きなコレクションで
cascade: ['remove']を使うのは避けてください(行ごとに DELETE が実行されます)。共有エンティティにはorphanRemovalを決して使わないでください。 - 2 つのエンティティマネージャーにまたがる関連は作成できません。
- デフォルト以外のエンティティマネージャーでは、
ManagerRegistry::getRepository(Entity::class, 'name')を使ってリポジトリを取得してください。
段階的な情報開示
- 実行時の基本方針とリスク管理には、このファイルを使用します。
- 実装の詳細を確認する必要がある場合は、リファレンスを開いてください。
出力仕様
- 所有側と逆側、cascade と orphan の判断を含むエンティティマッピング。
- 大きなコレクションと頻繁に使われる処理経路のフェッチ戦略。
doctrine:schema:validateの結果。
リファレンス
reference.md
コメント
Markdown 対応