sql >> Database teknologi >  >> RDS >> Mysql

Haversine afstandsberegning mellem to punkter i Laravel

Dette var min implementering af det. Jeg har valgt at kalde min forespørgsel ud i forvejen, på denne måde kan jeg drage fordel af Pagination . Desuden skal du eksplicit vælge de kolonner, du ønsker at hente fra forespørgslen. tilføj dem ved ->select() . Såsom users.latitude, users.longitude, products.name , eller hvad de nu måtte være.

Jeg har lavet et skop, der ser sådan ud:

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 anvende dette omfang på enhver model med en latitude og longitude .

Erstat $location->latitude med din latitude som du ønsker at søge på, og erstatte $location->longitude med den længdegrad, du ønsker at søge mod.

Erstat model.latitude og model.longitude med de modeller, du ønsker at finde omkring $location baseret på afstanden defineret i $radius .

Jeg ved, at du har en fungerende Haversine-formel, men hvis du har brug for sideinddeling, kan du ikke bruge den kode, du har leveret.

Forhåbentlig hjælper dette.



  1. SQL Pivot - Ved, hvordan man konverterer rækker til kolonner

  2. Hvordan rettes uløst eksternt symbol på grund af MySql Connector C++?

  3. Sådan giver du fjernadgang til en enkelt MySQL-database

  4. TSQL - Hvordan bruger man GO inde i en BEGIN .. END blok?