sql >> Database >  >> RDS >> Mysql

Haversine afstandsberekening tussen twee punten in Laravel

Dit was mijn uitvoering ervan. Ik heb ervoor gekozen om mijn vraag van tevoren te aliasen, op deze manier kan ik profiteren van Pagination . Verder moet u expliciet de kolommen selecteren die u uit de query wilt halen. voeg ze toe aan de ->select() . Zoals users.latitude, users.longitude, products.name , of wat ze ook mogen zijn.

Ik heb een bereik gemaakt dat er ongeveer zo uitziet:

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

U kunt dit bereik toepassen op elk model met een latitude enlongitude .

Vervang de $location->latitude met uw latitude waarnaar u wilt zoeken, en vervang de $location->longitude met de lengtegraad waarop u wilt zoeken.

Vervang de model.latitude en model.longitude met de modellen die u wilt vinden rond de $location gebaseerd op de afstand gedefinieerd in de $radius .

Ik weet dat je een werkende Haversine-formule hebt, maar als je moet pagineren, kun je de code die je hebt opgegeven niet gebruiken.

Hopelijk helpt dit.



  1. MySql-fout:1364 veld 'display_name' heeft geen standaardwaarde

  2. Stel een standaardwaarde in voor een kolom in SQLite:DEFAULT-beperking

  3. Wat hebben de Olympische Spelen, UEFA Euro 2016 voetbalwedstrijden en databases met elkaar gemeen?

  4. SQL TUSSEN-Slimme tips om te scannen op een reeks waarden