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.