2011-08-04 12 views
20

私は熱心に読み込みたいエンティティを持ち、他の事例では怠け者(または余分な遅延)負荷があります。Doctrine 2では、実行時にフェッチモード(Eager/Lazyなど)を変更できますか?

私のマッピングでは、YAMLで宣言されているフェッチモードがないので、デフォルト(遅延ロード)を使用します。

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

理想的には、関連するすべてのオブジェクトを読み込んでいるルートエンティティと力強さをロードするのが理想です。私はこれを行うことができる方法はありますか?

なぜそうでない場合(実装されていない機能を超えている理由がありますか)

答えて

20

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

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

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

+0

お返事ありがとうございます。私は、意見を述べたいと思う誰かがいる場合には、しばらくの間質問を開きます。 – calumbrodie

+2

結果に関連エンティティを含めるには、 'addSelect( 'alias')'にすべての結合テーブルエイリアスを追加することを忘れないでください。 – juanmf

21

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

+2

Many-to-OneとOne-to-Oneの関連付けにのみ使用できることに注意してください。 – murtho

+4

私はちょうど2時間を失ってしまったので、setFetchModeで最初のパラメータは現在のクラスを参照する必要があり、 。クラスはAppBundle \ Entity \ Student(例のように表示)のように表示する必要があります –

+0

2時間? 2日で私をカウント! Symfonyにはどのように迷惑をかけるのが狂っていますか?/ – Sliq

関連する問題