sql >> Databasteknik >  >> RDS >> Mysql

Haversine avståndsberäkning mellan två punkter i Laravel

Detta var min implementering av det. Jag har valt att alias min fråga i förväg, på så sätt kan jag dra fördel av Pagination . Dessutom måste du explicit välja de kolumner som du vill hämta från frågan. lägg till dem vid ->select() . Såsom users.latitude, users.longitude, products.name , eller vad de nu kan vara.

Jag har skapat ett scope som ser ut ungefär så här:

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]);
}

Du kan tillämpa detta omfång på alla modeller med en latitude och longitude .

Ersätt $location->latitude med din latitude som du vill söka mot, och ersätt $location->longitude med den longitud som du vill söka mot.

Byt ut model.latitude och model.longitude med de modeller du vill hitta runt $location baserat på avståndet definierat i $radius .

Jag vet att du har en fungerande Haversine-formel, men om du behöver paginera kan du inte använda koden du har angett.

Förhoppningsvis hjälper detta.



  1. Finns det en timeout för inaktiva PostgreSQL-anslutningar?

  2. Kan jag blint ersätta alla mysql_-funktioner med mysqli_?

  3. Hur man migrerar en Oracle-databas från AWS EC2 till AWS RDS

  4. 2 sätt att formatera ett tal med ledande nollor i Oracle