To była moja realizacja. Wybrałem aliasowanie mojego zapytania z wyprzedzeniem, w ten sposób mogę skorzystać z Pagination . Ponadto musisz wyraźnie wybrać kolumny, które chcesz pobrać z zapytania. dodaj je w ->select() . Na przykład users.latitude, users.longitude, products.name , czy cokolwiek to może być.
Stworzyłem zakres, który wygląda mniej więcej tak:
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]);
}
Możesz zastosować ten zakres do dowolnego modelu z latitude ilongitude .
Zastąp $location->latitude ze swoją latitude które chcesz wyszukać, i zastąp $location->longitude z długością geograficzną, według której chcesz wyszukiwać.
Zastąp model.latitude i model.longitude z Modelami, które chcesz znaleźć w okolicy $location na podstawie odległości zdefiniowanej w $radius .
Wiem, że masz działającą formułę Haversine, ale jeśli potrzebujesz stronicowania, nie możesz użyć dostarczonego kodu.
Mam nadzieję, że to pomoże.