IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Ajouter un tri par distance dans une requête de géolocalisation


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut Ajouter un tri par distance dans une requête de géolocalisation
    Bonjour,

    J'ai un form qui comporte uniquement un champ Address, en résumé, le site géolocalise grâce a cette adresse et affiche les items mais sans tri de distance !

    Voici ma requete dans mon repo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
        /**
         * @return Query
         */
        public function findAllVisibleQuery(AdSearch $search): Query
        {
            $query = $this->findVisibleQuery();
     
            if ($search->getLat() && $search->getLng() && $search->getDistance()) {
                $query = $query
                    ->select('a')
                    ->andWhere('(6353 * 2 * ASIN(SQRT( POWER(SIN((a.lat - :lat) *  pi()/180 / 2), 2) +COS(a.lat * pi()/180) * COS(:lat * pi()/180) * POWER(SIN((a.lng - :lng) * pi()/180 / 2), 2) ))) <= :distance')
                    ->setParameter('lng', $search->getLng())
                    ->setParameter('lat', $search->getLat())
                    ->setParameter('distance', $search->getDistance());
            }
     
        private function findVisibleQuery(): QueryBuilder
        {
            return $this->createQueryBuilder('a')
                ->where('a.publishedAt != false');
        }
    La requête fonctionne très bien mais quand je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->orderBy('a.distance', 'ASC')
    J'ai le message d'erreur :
    [Semantical Error] line 0, col 253 near 'distance ASC': Error: Class App\Entity\Ad has no field or association named distance
    Alors, j'ai bien compris le message il ne trouve pas de champ ou d'association nommée distance ok mais comment faire pour avoir un tri de la distance la plus petite a la distance la plus grande.

    je vous remercie les amis

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    ->andWhere('(.......) AS distance <= :distance')

  3. #3
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    Merci pour la réponse mais la solution ne fonctionne pas, j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        /**
         * @return Query
         */
        public function findAllVisibleQuery(AdSearch $search): Query
        {
            $query = $this->findVisibleQuery();
     
            if ($search->getLat() && $search->getLng() && $search->getDistance()) {
                $query = $query
                    ->select('a')
                    ->andWhere('(6353 * 2 * ASIN(SQRT( POWER(SIN((a.lat - :lat) *  pi()/180 / 2), 2) +COS(a.lat * pi()/180) * COS(:lat * pi()/180) * POWER(SIN((a.lng - :lng) * pi()/180 / 2), 2) ))) AS distance <= :distance')
                    //->orderBy('a.distance', 'ASC')
                    ->setParameter('lng', $search->getLng())
                    ->setParameter('lat', $search->getLat())
                    ->setParameter('distance', $search->getDistance());
            }
     
            return $query->getQuery();
        }
    Erreur :

    [Syntax Error] line 0, col 227: Error: Expected =, <, <=, <>, >, >=, !=, got ')'
    J'ai regardé attentivement mais je ne comprends pas

  4. #4
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Il n'y a pas de As dans un prédicat en DQL.

    Essaie plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->andWhere('(6353 * 2 * ASIN(SQRT( POWER(SIN((a.lat - :lat) *  pi()/180 / 2), 2) +COS(a.lat * pi()/180) * COS(:lat * pi()/180) * POWER(SIN((a.lng - :lng) * pi()/180 / 2), 2) ))) <= :distance')
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre éclairé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Par défaut
    salut, ton code est identique a mon premier post

    il ne tri pas les items par ordre de distance.

  6. #6
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Non, mon code n'est pas identique. Regarde plus attentivement la fin de la ligne, tu verras une différence. J'ai retiré le "as distance" qui fait planter ta requête DQL.
    Pour trier par la distance, tu dois malheureusement la recalculer avec DQL.
    Tu peux pet-être le faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ->addOrder('(6353 * 2 * ASIN(SQRT( POWER(SIN((a.lat - :lat) *  pi()/180 / 2), 2) +COS(a.lat * pi()/180) * COS(:lat * pi()/180) * POWER(SIN((a.lng - :lng) * pi()/180 / 2), 2) )))', 'asc');
    (N'oublie pas de laisser le addWhere tel que je l'ai mis pour garder le filtre sur la distance maximale)
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] remplacer AND par WHERE dans une requête SQL
    Par Kyaan dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 14h42
  2. Réponses: 4
    Dernier message: 22/02/2008, 10h02
  3. division par 0 dans une requête donne #Erreur
    Par bugprog dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/05/2007, 09h57
  4. [Access] Calcule par ligne dans une requête
    Par Belze dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/02/2006, 09h09
  5. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo