2

Doctrine 2 は自動 JOIN 生成をサポートしていますか? つまり、いくつかの製品エンティティに関連付けられた販売者エンティティがあり、それぞれがカテゴリを持ち、次のようなことを行うと仮定します

$sellers = $entityManager->getRepository('Foo\Bar\Seller')->findBy(array('country' => 'US'), array('populate' => array('Product', 'Product.Category')));
foreach ($sellers as $seller) {
    doStuffWith($seller->product->category);
}

Doctrine は商品とカテゴリのテーブルを販売者のテーブルに結合し、結果を使用して関連付けを事前設定するため、すべてが 1 つのクエリで済みます。このようなことは可能ですか?

4

2 に答える 2

3

JOIN を自動的に実行するには、次の 2 つの方法があります。

  • 熱心なフェッチを使用する
  • DQL を使用する

Eager fetching とは、メイン エンティティがフェッチされるたびに、Doctrine 2 が「eager」とマークされたリレーションも自動的にフェッチすることを意味します。これはfetch、マッピングで属性を使用して行われます ( Manual: ManyToOneを参照) 。

DQL では、メイン エンティティと関連エンティティの両方を取得するクエリを記述する必要があります。

SELECT m, r FROM My\MainEntity m LEFT JOIN m.relatedEntity r

Eager fetching と DQL の利点は、Eager fetch を使用すると、基本的に自動的に機能を取得できることです。ただし、熱心なフェッチの欠点は、関連するエンティティを実際に使用しないと、パフォーマンスが低下する可能性があることです。DQL を使用すると、何をいつフェッチするかを常に制御できます。

于 2012-05-18T15:05:23.893 に答える