2015-05-18 89 views
1

我只想列出需要連接的表(建築物)中的所有實體,以顯示一些細節(建築物管理)。我想使用Doctrine fetch join選項來避免額外的查詢,因爲每個建築物都必須顯示其建築物管理中的數據。Symfony2:在樹枝中顯示獲取連接結果

下面是一個基本的控制器例子。我的問題是,必須在選擇中包含bm以便使用提取而非常規聯接。因此,$entities變量包含bbm個實體,並且Twig中的循環僅等待b個實體。我該如何解決這個問題?

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    // This way is working, but extra queries are generated when I need to access the BuildingManagement data from Building entity 
    //$entities = $em->getRepository('TrilogisPropertyBundle:Building')->findAll(); 

    $entities = $em->createQuery(
      'SELECT b, bm 
      FROM MyBundle:Building b 
      JOIN MyBundle:BuildingManagement bm WITH bm.building = b.id 
      ORDER BY b.id')         
      ->getResult(); 

    return $this->render('MyBundle:Test:index.html.twig', array(
     'entities' => $entities, 
    )); 
} 

而且在嫩枝

<table> 
    <thead> 
     <tr> 
      <th>ID</th> 
      <th>Building Management</th> 
     </tr> 
    </thead> 
    <tbody> 
    {% for entity in entities %} 
     <tr> 
      <td>{{ entity.id }}</td>  
      <td>{{ entity.buildingManagement.id}}</td> <-- will crash because the entity must be a building and not a buildingManagement            
     </tr> 
    {% endfor %} 
    </tbody> 
</table> 
+0

Building和BuildingManagement之間有ORM關係嗎?通過這種方式,您可以訪問Building Management中的BuildingManagement – Cr3aHal0

+0

@ Cr3aHal0當然,我有一個關係。但是您需要知道,從Building訪問BuildingManagement會創建一個我想避免的額外查詢 – sdespont

回答

2

如果你說,大約有評論在這兩個之間的關係也是如此,那麼你很可能在做JOIN錯誤的方式:

查詢也許應該是:

$entities = $em->createQuery(
      'SELECT b, bm 
      FROM MyBundle:Building b 
      JOIN b.buildingManagement bm 
      ORDER BY b.id')         
      ->getResult(); 

有些事情要注意:

  • 您需要在Building實體中使用buildingManagement成員才能使其工作。
  • buildingManagement應該從它的外觀註釋@ManyToOne。可能是@ManyToMany,但這取決於應用程序的邏輯。
  • 或者,buildingManagement應標記爲反轉。如果您使用實體(兩者)更新您的問題,我們可以幫助您確定。
+0

謝謝,指定連接的表的bundle強制不會對建築對象進行水合並將buildingManagement作爲行返回。 – sdespont

+0

啊太棒了! :) 很高興我能幫上忙 ;) –