web-dev-qa-db-ja.com

Doctrine 2)では、フェッチモード(Eager / Lazyなど)を実行時に変更できますか?

私は熱心にロードしたいエンティティを持っており、他の機会には遅延(または余分な遅延)ロードを行います。

私のマッピングにはYAMLで宣言されたフェッチモードがないため、デフォルト(遅延読み込み)が使用されます。

現在、熱心にロードする唯一の方法は、DQLを手動で構築することです。これは、新しいエンティティを追加するたびに更新する必要があります。

理想的には、ルートエンティティをロードし、関連するすべてのオブジェクトを強制的にロードします。これを行う方法はありますか?

そうでない場合(実装されていない機能である以外に理由があります)?

21
calumbrodie

組み込みのリポジトリメソッド(find()、findAll())を使用する場合は、アノテーションを熱心にロードするように設定しない限り、おそらく運が悪いでしょう。

カスタムリポジトリのメソッドでクエリビルダー(または生のDQL)を使用して、必要な場所に積極的な読み込みを強制することをお勧めします。はい、エンティティを追加するときにそのメソッドを更新する必要がありますが、少なくとも遅延/熱心な読み込みに関して何が起こっているかを常に知っているので、すべてを1か所で維持するだけで済みます。

Find()などに$ eagerLoadフラグがない理由は、これらが単純なタスクの便利なメソッドだからだと思います。このようなフラグを追加したい場合は、再帰的な積極的な読み込みを深さで制限したい状況にすぐに陥ります。また、循環参照(たとえば、双方向の関連付け)についても心配する必要があります。

22
timdev

DQLのsetFetchMode()メソッドを使用してモードを設定できます。ドキュメントを参照してください: http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

22
atorkhov