2015-07-28 46 views
3

當我在原則執行是這樣的:分配多個不同的實體,以一個陣列排學說

$qb = $doctrine 
    ->getRepository('EntityA') 
    ->createQueryBuilder('a') 
    ->addSelect('b') 
    ->join('EntityB', 'b', 'WITH', 'a.b = b') 
    ->getQuery() 
    ->getResult() 

我得到一個數組,看起來像這樣:

array(0 => EntityA, 
     1 => EntityB, 
     2 => EntityA, 
     4 => EntityB) 

事實上,我得到2個結果行,而是一個大小爲4的數組。這使得遍歷它幾乎不可能在模板中顯示。

我想這樣的結果:

array(0 => array(EntityA, EntityB), 
     1 => array(EntityA, EntityB)) 

當然我可以創建EntityA映射引用EntityB。但即使有可能改變加載行爲,例如LAZY,EAGER等,可能希望有可能在運行中創建這種關係。

例如:

在具有大量實體的概觀,需要EAGER加載,以防止查詢的過量。但是,當我只想顯示一個實體並且不需要額外的數據時,LAZY加載更加可取。

回答

0

既然你已經EntityB映射爲EntityA.b,通過這種關係所示:

...join('EntityB', 'b', 'WITH', 'a.b = b')... 

因此,你實際上並不增加b來選擇需要爲您加載它要麼熱切lazily

從您的查詢生成器中刪除->addSelect('b'),並使用EntityB通過您的EntityA.b映射。

實施例:

$as = $doctrine 
    ->getRepository('EntityA') 
    ->createQueryBuilder('a') 
    ->join('EntityB', 'b', 'WITH', 'a.b = b') 
    ->getQuery() 
    ->getResult(); 

foreach($as as $a){ 
    echo "EntityA property".$a->id; 
    echo "EntityB property".$a->b->id; 
} 

這個查詢將返回EntityAArrayCollection

注:上述的示例假定EntityA.b是一個公共屬性。

更新:

一些挖我發現這個舊的帖子後:Doctrine 2 QueryBuilder add multiple select elements /parameters?。根據它,你可以通過直接用逗號分隔實體而不是使用->addSelect()方法來得到你想要的結果。

請嘗試以下DQL:

$query = $em->createQuery("SELECT a, b FROM EntityA a JOIN a.b b") 

上面的查詢將動態預先抓取b

+0

因此,我仍然懶惰地將'EntityB'映射到'A',通過Annotation說。通過手動加入,我模仿一個渴望的獲取? Doctrine會識別提取的數據並將其設置爲'EntityA'上的相應字段?這將是整潔... – Joshua

+0

@Joshua其實經過多研究一些話題後,我發現我錯了。根據官方文檔:「一個連接(不管是內連接還是外連接)只要連接實體的字段出現在聚合函數之外的DQL查詢的SELECT部分​​中,就會變成」獲取連接「。否則,它是一個「常規加入」。# – Mark

+0

@Joshua今天我會研究一下這個話題,並提出一個不同的解決方案。 – Mark