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.