2017-06-13 65 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

好的,首先,如果我得到你所要求的权利,我更改代码,所以你会有那里的一个订单的数量很多,他们链接到 –