2017-06-13 62 views
0

在一個限制可用選項的傳統項目上工作,讓我處於一種需要解決以下問題的情況,理想情況下使用原則。主義從一個(多對一單向(不同的捆綁))中選擇許多

我有兩個實體在不同的包中有一個單向的多對一鏈接。

BundleA對BundleB依賴和實體鏈接與此類似:

BundleA /實體/ TheMany:

/** 
* @var TheOne $theOne 
* @ORM\ManyToOne(targetEntity="BundleB\Entity\TheOne") 
* @ORM\JoinColumn(name="theone_id", referencedColumnName="id", onDelete="SET NULL") 
* 
*/ 
private $theOne; 

從BundleB我現在需要選擇所有TheOne實體,併爲每個我需要所有TheMany實體。

該查詢還需要對TheOne實體的任何屬性或相關TheMany實體的計數進行排序。

在Doctrine中構建一個查詢會帶回所有TheOne實體以及每個TheMany中的一個......但我有一些困難提出了一個將帶回所有相關TheMany的Doctrine查詢的查詢實體而不只是一個。

我希望有人可能遇到類似的問題,因此有一些洞察力?

這可能沒有得到足夠清晰的解釋,在這種情況下請指導我進一步解釋。

回答

0

我到底能達到什麼,我需要通過使用GROUP_CONCAT(這需要列入https://github.com/beberlei/DoctrineExtensions)。

查詢看起來是這樣的:

$queryBuilder->select(
     'to, 
     GROUP_CONCAT(DISTINCT tm.id SEPARATOR \',\') as theManyIds, 
     COUNT(DISTINCT tm.id) as HIDDEN theManyCount' 
    ) 
     ->from('BundleB\Entity\TheOne', 'to') 
     ->leftJoin(
      'BundleA\Entity\TheMany', 
      'tm', 
      Join::WITH, 
      'to.id = tm.theOne' 
     ) 
     ->groupBy('to.id') 
     ->orderBy($sortString, $direction) 
     ->setFirstResult($start) 
     ->setMaxResults($limit); 

我通過接受兩束連接的後果損害 - 然而這本來是可以避免通過使用本地SQL和結果集映射(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html)。

0

所以你要做的是獲得所有的和每個人找到所有的很多。但是你想把所有的多數放在一個數組中,或者你想爲實體創建一個數組數組? (我在這裏所做)

$em = $this->getDoctrine()->getManager(); 
$theones = $em->getRepository('BundleA:theOne') 
    ->createQueryBuilder('p') 
    ->OrderBy(//your ordering) 
    ->getQuery() 
    ->getArrayResult() 

$theManies = []; 

for($theones as $theOne){ 
    $theManies [] = $em->getRepository('BunbleB:theMany') 
     ->createQueryBuilder('p') 
     ->Where('p.theOne = :theOne') 
     ->setParameter('theOne', $theOne) 
     ->getQuery() 
     ->getArrayResult(); 
    $finalOnes[$theOne->getId()] = sizeof($theManies) 
} 

asort($finalOnes); 
return array_keys($finalOnes); 
+0

類似的東西,但這種方法有兩個問題,第一個是我需要通過與任何給定TheOne實體關聯的「TheMany」實體的數量來排列TheOne列表。另一個問題是BundleA沒有BundleB的可見性。我不能引入這個鏈接,因爲它是一個循環依賴。 BundleA需要BundleB,但BundleB不需要BundleA(由於與作曲家之類的事情有關的循環依賴性問題,我不能將其作爲需求添加)。實際上,這兩個捆綁是相互依賴的,應該合併,但我不能因爲各種原因這樣做。 – ViniH

+0

另一點是,如果我得到實際水合的TheMany實體,這對任務的目的無關緊要,實際上我只需要逗號分隔的ID列表。我覺得我可能不得不求助於SQL而不是DQL。 – ViniH

+0

好的,首先,如果我得到你所要求的權利,我更改代碼,所以你會有那裏的一個訂單的數量很多,他們鏈接到 –