Bonjour,

Dans mon repository, dans la fonction "findByProximityQuery', je renvoie les annonces (chacune liée à un véhicule lui-même lié à une adresse) triées par ordre croissant de distance par rapport à une latitude et une longitude données. En plus des annonces, je renvoie également la distance elle-même afin de pouvoir l'afficher.

Mon problème, c'est que comme j'ajoute la distance dans mon select, le résultat de la requête n'est plus une collection d'annonces.

Voici la partie du code de ma fonction dans laquelle j'ajoute la distance à mon select :


...
        $query = $this->createQueryBuilder('a')
                      ->distinct(true)
                      ->join('a.vehicle', 'v')
        ;

        if ($search->getLatitude() && $search->getLongitude()) 
        {
            $sqlDistance = '(6353 * 2 * ASIN(SQRT( POWER(SIN((s.latitude - :latitude) *  pi()/180 / 2), 2) +COS(s.latitude * pi()/180) * COS(:latitude * pi()/180)' . 
                           ' * POWER(SIN((s.longitude - :longitude) * pi()/180 / 2), 2) ))) as distance';

            $query
                ->addSelect($sqlDistance)
                ->join('v.situation', 's') //Ici, c'est l'adresse qui contient la latitude et la longitude
                ->orderBy('distance', 'ASC')
                ->setParameter('longitude', $search->getLongitude())
                ->setParameter('latitude', $search->getLatitude())
            ;
...
return $query->getQuery();
...

Or, dans la suite de mon traitement, j'affiche les différentes annonces en utilisant des propriétés et des méthodes de l'entité "Advert". Cependant, à cause du addSelect($sqlDistance), ce n'est plus une collection d'annonces qui m'est retournée.

Dès lors, je ne sais pas comment soit modifier ma requête, soit comment traiter le résultat de ceci pour travailler avec des objets de type "Advert".

Quelqu'un aurait une idée?

Merci d'avance pour votre aide.

3 réponses


dubitoph
Auteur

J'ai réussi à obtenir ce que je cherchais en procédant de cette manière :

Dans mon repository, je renvoie le résultat comme ceci :


        return $query->getQuery()
                     ->getResult();

Dans mon controller, je le traite de cette manière :
    $results = $this->advertRepository->findByProximityQuery($search);

    foreach ($results as $result) 
    {

        $adverts[] = $result[0];

        $advertId = $result[0]->getId();

        $distances[$advertId] = round($result["distance"], 2);

    }
    Cependant, je me demande s'il n'y a pas une manière plus performante de travailler...

nice Post ! its interesting. thank you for sharing....

That’s what I need. thank you for sharing.