Detta var min implementering av det. Jag har valt att alias min fråga i förväg, på så sätt kan jag dra fördel av Pagination
. Dessutom måste du explicit välja de kolumner som du vill hämta från frågan. lägg till dem vid ->select()
. Såsom users.latitude, users.longitude, products.name
, eller vad de nu kan vara.
Jag har skapat ett scope som ser ut ungefär så här:
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]);
}
Du kan tillämpa detta omfång på alla modeller med en latitude
och longitude
.
Ersätt $location->latitude
med din latitude
som du vill söka mot, och ersätt $location->longitude
med den longitud som du vill söka mot.
Byt ut model.latitude
och model.longitude
med de modeller du vill hitta runt $location
baserat på avståndet definierat i $radius
.
Jag vet att du har en fungerande Haversine-formel, men om du behöver paginera kan du inte använda koden du har angett.
Förhoppningsvis hjälper detta.