2017-11-17 2 views
1

Ich habe eine JSON Spalte in meiner Datenbank, die Längen- und Breitengrad speichert Koordinaten aufgebaut wie:Laravel - Beim Abrufen der Entfernung, wenn Länge und Breite eines Benutzers angegeben werden, erhalte ich bei allen Modellen das gleiche Ergebnis. Warum?

_geoloc:{lat: 33.6556324, lng: -117.7015161}. 

Ich versuche, die Datenbank mit einer Breite Länge & des Benutzers abfragen Koordinaten alle Datensätze abzurufen, die innerhalb eines bestimmten fallen Entfernung. Unten ist die Funktion, die ich verwende, aber alle Ergebnisse geben die gleiche Entfernung von 7797.5012454514 mit jedem Modell zurück. Ich möchte den Parameter $distance als Meilen übergeben.

protected function get_locations($latitude, $longitude, $distance = 8000) { 
    $results= my_table::select('my_table.*') 
     ->selectRaw('(3959 * (acos(cos(radians(?)) 
      * cos(radians("_geoloc->lat")) 
      * cos(radians("_geoloc->lng") - radians(?)) 
      + sin(radians(?)) 
      * sin(radians("_geoloc->lat"))))) 
     AS distance', [ $latitude, $longitude, $latitude ]) 
     ->havingRaw("distance< ?", [ $distance ]) 
     ->groupBy('first_name') 
     ->get(); 
    return $results; 
} 

Antwort

0

Falls jemand anderes auf das gleiche Problem stößt. Die Lösung erfordert, dass ein JSON_EXTRACT in der Abfrage zusammen mit einem $ -Symbol verwendet wird, um das Objekt zu tokenisieren.

protected function get_locations($latitude, $longitude, $distance = 20) { 
    $results = (new my_table)->having('distance', '<', $distance) 
             ->select(DB::raw("*, 
       (3959 * ACOS(COS(RADIANS($latitude)) 
         * COS(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))) 
         * COS(RADIANS($longitude) - RADIANS(JSON_EXTRACT(`_geoloc`,'$.lng'))) 
         + SIN(RADIANS($latitude)) 
         * SIN(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))))) AS distance") 
            )->orderBy('distance', 'asc') 
             ->get(); 
    return $results 
} 
Verwandte Themen