2013-07-02 58 views
2

在我的Symfony2項目,我有這樣的查詢:Symfony2中和Doctrine2 - QueryBuilder的與關係實體

$paperQB = $this->createQueryBuilder('p') 
     ->select('p') 
     ->where("p.title LIKE :q OR p.keywords LIKE :q OR p.abstract LIKE :q OR p.id LIKE :q") 
     ->setFirstResult($first_result) 
     ->setMaxResults($papers_per_page) 
     ->orderBy($sort_by_culumn, $sort_by_order) 
     ->setParameter('q', '%'.$q.'%'); 

一切都很好有,但在我的論文的實體,我與一個多對一的關係部分實體。所以,我想也可以得到:

"OR p.section.name LIKE :q"

這怎麼可能,我應該用在爲了做到這一點聯接?查詢圖片不知道如何在控制器中使用這些關係:$p->getSection()->getName()或在樹枝p.section.name

非常感謝。

編輯:

我所做的那一刻:

$paperQB = $this->createQueryBuilder('p') 
     ->select('p') 
     ->where("p.title LIKE :q OR p.keywords LIKE :q OR p.abstract LIKE :q OR p.id LIKE :q OR s.name LIKE :q OR c.name_full LIKE :q") 
     ->leftJoin('p.conference', 'c') 
     ->leftJoin('p.section', 's') 
     ->setFirstResult($first_result) 
     ->setMaxResults($papers_per_page) 
     ->orderBy($sort_by_culumn, $sort_by_order) 
     ->setParameter('q', '%'.$q.'%'); 

但爲什麼查詢生成器不使用實體和它們之間的關係?

回答

3

由於性能原因,默認行爲不會加載相關實體的字段,它僅提供與OBJECT水合(即默認水合模式)的關係的代理類。

你必須說明JOIN。

編輯:當您從控制器或p.section.name從一根樹枝做模板$p->getSection()->getName(),而不必說在查詢(使用默認的QueryBuilder)的JOIN,學說請求缺少此時的關係的信息。這可能會非常沉重,如果你在循環中這樣做,就像在列表顯示中一樣......所以試着在第一次請求時加載你需要的關係;)

+0

謝謝你的回答。 –