2015-08-14 35 views
0
$news = \DB::getEntityManager()->createQueryBuilder() 
    ->select('n') 
    ->from('Model\News', 'n') 
    ->join('n.category', 'c') 
    ->join('n.locales', 'l') 
    ->where('l.language = :lang AND n.id = :id AND n.published = 1') 
    ->setParameter('id', $news_id) 
    ->setParameter('lang', $lang) 
    ->getQuery() 
    ->getResult(); 

$news->category->getName(); 

該代碼生成兩個查詢而不是一個後產生兩個查詢。 爲什麼?學說2 - 加入實體仍然是一個代理和請求

在得到我的$news實體後,category屬性仍然是一個Doctrine代理類(Application\Proxies\__CG__\Model\News\Category)。 \Model\News\Category的實例只有在獲得某些類別數據(例如,$news->category->getName())後纔會加載,並且它將生成附加的 SQL查詢。

如何使Doctrine下載\Model\News及其相關的\Model\News\Category只有一個查詢?

下面是category場與註釋的配置從\Model\News

/** 
* @ManyToOne(targetEntity="\Model\News\Category", inversedBy="news", fetch="EAGER") 
*/ 
public $category; 

,你可以看到... EAGER是不工作...

回答

1

你的第一個行更改爲->select('n, c')使學說將水合您的新聞和類別實體。

+0

只有當Doctrine緩存設置爲「ArrayCache」以外時它才能工作嗎? –