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.