2013-12-23 59 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();