Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Haversine-Entfernungsberechnung zwischen zwei Punkten in Laravel

Das war meine Umsetzung davon. Ich habe mich entschieden, meine Abfrage im Voraus mit einem Alias ​​zu versehen, damit ich die Vorteile der Pagination nutzen kann . Außerdem müssen Sie explizit die Spalten auswählen, die Sie aus der Abfrage abrufen möchten. fügen Sie sie bei ->select() hinzu . Zum Beispiel users.latitude, users.longitude, products.name , oder was auch immer sie sein mögen.

Ich habe einen Bereich erstellt, der in etwa so aussieht:

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

Sie können diesen Bereich auf jedes Modell mit einem latitude anwenden und longitude .

Ersetzen Sie $location->latitude mit Ihrem latitude nach denen Sie suchen möchten, und ersetzen Sie $location->longitude mit dem Längengrad, nach dem Sie suchen möchten.

Ersetzen Sie model.latitude und model.longitude mit den Modellen, die Sie rund um $location finden möchten basierend auf der im $radius definierten Distanz .

Ich weiß, dass Sie eine funktionierende Haversine-Formel haben, aber wenn Sie paginieren müssen, können Sie den bereitgestellten Code nicht verwenden.

Hoffentlich hilft das.