2012-05-18 35 views
2

Doctrine 2是否支持自動JOIN生成?也就是說,假設我有與一些產品的實體,每個都有一個類別相關聯的賣家實體,做這樣的事情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); 
} 

整個事情將採取單一的查詢,因爲教義將加入產品和分類表到賣家表並使用結果預先填充關聯。是這樣的可能嗎?

回答

3

你有兩種方法來自動做一個JOIN:

  • 用渴望獲取
  • 使用DQL

渴望獲取意味着只要主要實體是牽強,原則2將自動也獲取標記爲「渴望」的任何關係。這是通過使用映射的fetch屬性來完成(見Manual: ManyToOne

隨着DQL,你需要寫一個取兩者的主要實體和相關實體/實體的查詢:

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

渴望提取與DQL的好處在於,在提前取用的情況下,您將基本上自動獲取該功能。然而,急於提取的缺點是,如果您實際上沒有使用相關實體,則可能會導致性能損失。使用DQL,您始終可以控制您獲取的內容和時間。

+0

DQL不是我自動調用的。渴望提取會很好(並且似乎可以[動態啓用它](http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily -dis-mode-in-dql)),但據我所知,它仍然會產生一堆查詢:而不是一個JOIN,它會做類似於'SELECT * FROM sellers','SELECT * FROM產品WHERE ID IN(...)'˙,'SELECT * FROM WHERE id IN(...)'類別,這仍然是一個慢點。或者我誤解了一些東西? – Tgr

+0

據我所知,一個急切的抓取應該做一個JOIN。我真的不明白爲什麼它會使用這樣的IN查詢 –

+0

非常感謝!這個解決方案(在關係中獲取= EAGER)在我的一個頁面上將查詢數從111減少到了9!真棒解決方案。從未聽說過。 –