5

Doctrineのポイントが欠けていますか?一部のシナリオでは非常に便利ですが、IDを使用してエンティティを取得する基本的なシナリオ(たとえば、find()またはfindOneBy()を使用)では、メインエンティティのプロパティにデータを入力するためにすべての関係に対してクエリが実行されるのはなぜですか?

確かに、私が作成したマッピング/アノテーションを使用すると、Doctrineは、各エンティティを取得するためのDQLクエリを作成しなくても、いくつかの結合と1つのクエリを実行できるはずです。

または、私が予測しているように、どこかでポイントを逃したことがありますか?

4

2 に答える 2

6

select関連するエンティティのエイリアスをクエリの一部に追加するだけです。

たとえば、 にBook1 対多を関連付けCoverており、表紙のある本を何冊か選択したいとします。

クエリ ビルダーでは、次を使用します。

->createQueryBuilder()
->select("book, cover")
->from("Book", "book")
->leftJoin("book.covers", "cover")

クエリでは、次を使用します。

SELECT book, cover FROM Book book LEFT JOIN book.covers cover

その結果、事前設定されたコレクションを含むコレクションを受け取りBookます$covers

于 2012-11-09T21:17:14.243 に答える
1

リレーションシップは必要な場合にのみハイドレートされるため、Doctrine はデフォルトで遅延読み込み戦略を使用します。関連エンティティにアクセスすることがすでにわかっている場合は、レコードと関連エンティティを取得する DQL クエリを作成する必要があります。

于 2012-11-09T21:04:29.877 に答える