Doctrine从一个中选择多个(多对一单向(不同的束))

时间:2017-06-13 09:39:12

标签: symfony doctrine-orm dql many-to-one

处理限制可用选项的遗留项目,使我处于需要解决以下问题的情况,理想情况是教条。

我有两个不同包中的实体,它们具有单向多对一链接。

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查询而不只是一个。

我希望有人可能会遇到类似的问题,因此有一些见解?

这可能没有得到足够清楚的解释,在这种情况下,请指导我进一步解释。

2 个答案:

答案 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);