DQL返回实体数组而不是对象

时间:2013-03-07 13:43:40

标签: arrays object symfony doctrine-orm

通常,如果我运行如下的DQL查询,它将返回一个实体对象列表:

$d = $this->getDoctrine()->getRepository('xxxWebsiteBundle:Locations')->createQueryBuilder('l');
            ->where('l.enabled = :enabled')
            ->setParameter('enabled', 1)
        $result= $d
            ->getQuery();

但是,如果我添加一个select,那么它将返回一个数组:

$d = $this->getDoctrine()->getRepository('XXXWebsiteBundle:Locations')->createQueryBuilder('l');
        $d
            ->select('l')
            ->addSelect(
            '( 3959 * acos(cos(radians(' . $latitude . '))' .
                '* cos( radians( l.latitude ) )' .
                '* cos( radians( l.longitude )' .
                '- radians(' . $longitude . ') )' .
                '+ sin( radians(' . $latitude . ') )' .
                '* sin( radians( l.latitude ) ) ) ) as distance'
        )
            ->where('l.enabled = :enabled')
            ->setParameter('enabled', 1)
            ->having('distance < :distance')
            ->setParameter('distance', $requestedDistance)
            ->orderBy('distance', 'ASC');
        $closeresult= $d
            ->getQuery();

因此,使用第一个查询,我可以执行以下操作:

foreach($result->getResult() as $location){
    echo $location->getName()
}

但是,使用第二个查询我必须使用以下假设不正确:

foreach($result->getResult() as $location){
        echo $location[0]->getName()
    }

我有什么想法可以改善这个?

1 个答案:

答案 0 :(得分:9)

自Doctrine ORM 2.2起,您可以使用HIDDEN关键字。

SELECT a, SOME_EXPR() AS HIDDEN sortCond FROM Entity a ORDER BY sortCond DESC

在您的示例中,它将如下所示:

$d = $this
    ->getDoctrine()
    ->getRepository('XXXWebsiteBundle:Locations')
    ->createQueryBuilder('l');

$d
    ->select('l')
    ->addSelect(
        '( 3959 * acos(cos(radians(' . $latitude . '))' .
            '* cos( radians( l.latitude ) )' .
            '* cos( radians( l.longitude )' .
            '- radians(' . $longitude . ') )' .
            '+ sin( radians(' . $latitude . ') )' .
            '* sin( radians( l.latitude ) ) ) ) AS HIDDEN distance'
    )
    ->where('l.enabled = :enabled')
    ->setParameter('enabled', 1)
    ->having('distance < :distance')
    ->setParameter('distance', $requestedDistance)
    ->orderBy('distance', 'ASC');

    $closeresult = $d->getQuery();