2013-03-07 12 views
5

Normalmente se esegue una query DQL come di seguito sarebbe restituirà un elenco di un'entità oggetti:DQL restituendo una serie di soggetti, invece di oggetti

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

Tuttavia, se si aggiunge un prescelto allora restituisce un array :

$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(); 

Quindi, utilizzando la prima query ho potuto effettuare le seguenti operazioni:

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

Tuttavia, utilizzando la seconda q Voglio usare il seguente che presumo non è corretto:

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

Qualche idea su come posso migliorare questo?

risposta

9

Da Doctrine ORM 2.2, è possibile utilizzare la parola chiave HIDDEN.

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

Nel tuo esempio, sarebbe come segue:

$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(); 
+0

Impressionante! Grazie – user1961082

Problemi correlati