2013-12-23 91 views
1

如何讓控制器使用一個SELECT從一個表中的所有實體與他的實體從另一個?Symfony2 Doctrine2多對多得到所有的實體與他們的關係實體

例如,如果我有一個表:應用程序和類別(許多到許多realation),我想要使用一個SELECT獲得與他們的類別的所有應用程序。怎麼做 ?內部聯接 ?

然後我想建立一個這樣的數組:

application=>categories 

[ 
    [AppName] => [Category1, Category2, Category3], 
    [AppName] => [Category1, Category2] 
] 

我試圖做這樣的事情:

$qb = $em->createQueryBuilder() 
      ->select("name, categories") 
      ->from('ComzettaApplicationsBundle:Application', 'name') 
      ->innerJoin('ComzettaApplicationsBundle:Application', 'categories'); 
$applicationsEntity = $qb->getQuery()->getResult(); 

但我不明白它的想法

回答

0

我想通了:

查詢的工作原理:

結果
$fields = array('a.Name', 'c.name'); 
    $query = $em->createQueryBuilder(); 
    $query 
     ->select($fields) 
     ->from('ComzettaApplicationsBundle:Application', 'a') 
     ->innerJoin('a.categories', 'c'); 
    $results = $query->getQuery()->getResult(); 

例如:

array (size=3) 
    0 => 
    array (size=3) 
     'Name' => string 'Google Earth DirectX' (length=20) 
     'category' => string 'Nowa1' (length=8) 
    1 => 
    array (size=3) 
     'Name' => string 'Acrobat Reader 10' (length=17) 
     'category' => string 'nowa2' (length=8) 
    2 => 
    array (size=3) 
     'Name' => string 'Acrobat Reader 10' (length=17) 
     'category' => string 'nowa3' (length=8) 
1

您只需調用實體的存儲庫,以獲得其相關對象,不需要聯接:

$this->get('doctrine.orm.entity_manager')->getRepository('ComzettaApplicationsBundle:Application')->findAll(); 
+0

在這種情況下,每個分類實體將對數據庫執行單獨的查詢 –

+0

和下一步是什麼?我是否必須在存儲庫類中設置一些toString方法? – Vardius

0

你可以這樣做即:

$qb = $em->createQueryBuilder() 
      ->select("application", "category") 
      ->from('ComzettaApplicationsBundle:Application', 'application') 
      ->join('application.categories', 'category'); 
$applicationsEntity = $qb->getQuery()->getResult();