2013-10-17 19 views
5

我有我的product實體這裏面對應的屬性:Symfony2:fetch =「EAGER」創建連接嗎?

/** 
* @ORM\ManyToMany(targetEntity="Group", mappedBy="products", indexBy="id", fetch="EAGER") 
* 
*/ 
protected $groups; 

我不知道,我對fetch="EAGER"的理解是,一旦選擇了這個產品,應該得到羣體,這是發生了什麼,但它使用2個查詢,當我做一些像findBy()一個查詢得到product和另一個得到groups

反正有做findBy()或其他輔助方法獲得沿着productgroups在一個查詢或唯一的辦法是寫一個自定義的庫函數,並做了LEFT-JOIN自己?

UPDATE

我嘗試多種解決方案和endup覆蓋findBy()功能是這樣的:

public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) 
{ 
    $q = $this 
    ->createQueryBuilder('u') 
    ->select('u, g') 
    ->leftJoin('u.groups', 'g') 
    ->setFirstResult($offset) 
    ->setMaxResults($limit); 

    foreach ($criteria as $field => $value) 
    { 
     $q 
      ->andWhere(sprintf('u.%s = :%s', $field, $field)) 
      ->setParameter($field, $value) 
     ; 
    } 

    foreach ($orderBy as $field => $value) 
    { 
     $q->addOrderBy(sprintf('u.%s',$field),$value); 
    } 

    try 
    { 
     $q = $q->getQuery(); 
     $users = $q->getResult(); 
     return $users; 
    } 
    catch(ORMException $e) 
    { 
     return null; 
    } 
} 

問題

1 - 我可以使用fetch="EAGER"使findBy返回product連同其groups在一個查詢

2 - 如果沒有,那麼是沒有辦法,我用fetch="EAGER"與多對許多實體沒有查殺性能

3-壓倒一切的findBy是一個很好的做法無論如何?有什麼缺點?

謝謝,

+0

據我所知,它不應該執行2個查詢 - 這是'EAGER'提取的關鍵。現在我想到了,我並不確定。我會盡快嘗試這個,只要我到我的開發箱... –

+0

@jperovic我試了兩個不同的項目,它仍然執行2個查詢。如果是這種情況,我不明白爲什麼我會使用findBy或findOneBy作爲與其他實體有關係的實體,它總是大約70%到90%的實體在任何項目中。 – trrrrrrm

+0

IT真的看起來像許多人一樣,fetch = eager並不是很有用,只是爲了好奇,如果你把產品實體作爲擁有者的一面,你會發現有什麼不同嗎? (改變mappedBy =「產品」inversedBy =「產品」) – Cesc

回答

1

FETCH_EAGER模式有問題。實際上有一個公開請求here來解決這個問題,但還沒有關閉。

我建議使用自定義存儲庫以您希望的方式獲取數據。