Dette var min implementering af det. Jeg har valgt at kalde min forespørgsel ud i forvejen, på denne måde kan jeg drage fordel af Pagination
. Desuden skal du eksplicit vælge de kolonner, du ønsker at hente fra forespørgslen. tilføj dem ved ->select()
. Såsom users.latitude, users.longitude, products.name
, eller hvad de nu måtte være.
Jeg har lavet et skop, der ser sådan ud:
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 anvende dette omfang på enhver model med en latitude
og longitude
.
Erstat $location->latitude
med din latitude
som du ønsker at søge på, og erstatte $location->longitude
med den længdegrad, du ønsker at søge mod.
Erstat model.latitude
og model.longitude
med de modeller, du ønsker at finde omkring $location
baseret på afstanden defineret i $radius
.
Jeg ved, at du har en fungerende Haversine-formel, men hvis du har brug for sideinddeling, kan du ikke bruge den kode, du har leveret.
Forhåbentlig hjælper dette.