Mysql
 sql >> Base de données >  >> RDS >> Mysql

Calcul de la distance Haversine entre deux points à Laravel

C'était ma mise en œuvre. J'ai choisi d'aliaser ma requête à l'avance, de cette façon je peux profiter de la Pagination . De plus, vous devez sélectionner explicitement les colonnes que vous souhaitez récupérer à partir de la requête. ajoutez-les au ->select() . Tels que users.latitude, users.longitude, products.name , ou quoi que ce soit.

J'ai créé une étendue qui ressemble à ceci :

public function scopeIsWithinMaxDistance($query, $location, $radius = 25) {

     $haversine = "(6371 * acos(cos(radians($location->latitude)) 
                     * cos(radians(model.latitude)) 
                     * cos(radians(model.longitude) 
                     - radians($location->longitude)) 
                     + sin(radians($location->latitude)) 
                     * sin(radians(model.latitude))))";
     return $query
        ->select() //pick the columns you want here.
        ->selectRaw("{$haversine} AS distance")
        ->whereRaw("{$haversine} < ?", [$radius]);
}

Vous pouvez appliquer cette portée à n'importe quel modèle avec une latitude etlongitude .

Remplacez le $location->latitude avec votre latitude que vous souhaitez rechercher, et remplacez le $location->longitude avec la longitude sur laquelle vous souhaitez effectuer la recherche.

Remplacez le model.latitude et model.longitude avec les modèles que vous souhaitez trouver autour du $location basé sur la distance définie dans le $radius .

Je sais que vous avez une formule Haversine fonctionnelle, mais si vous devez paginer, vous ne pouvez pas utiliser le code que vous avez fourni.

J'espère que cela vous aidera.