处理限制可用选项的遗留项目,使我处于需要解决以下问题的情况,理想情况是教条。
我有两个不同包中的实体,它们具有单向多对一链接。
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实体的Doctrine查询而不只是一个。
我希望有人可能会遇到类似的问题,因此有一些见解?
这可能没有得到足够清楚的解释,在这种情况下,请指导我进一步解释。
答案 0 :(得分:1)
最后,我通过使用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);
我通过接受链接两个捆绑包的后果而妥协 - 但是可以通过使用Native SQL和结果集映射(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html)来避免这种情况。
答案 1 :(得分: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);