Toto byla moje implementace. Rozhodl jsem se pro svůj dotaz předem alias, takže mohu využít výhody Pagination
. Dále musíte explicitně vybrat sloupce, které chcete z dotazu načíst. přidejte je do ->select()
. Například users.latitude, users.longitude, products.name
, nebo co to může být.
Vytvořil jsem rozsah, který vypadá asi takto:
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]);
}
Tento rozsah můžete použít na jakýkoli model s latitude
a longitude
.
Nahraďte $location->latitude
s vaší latitude
podle kterého chcete hledat a nahraďte $location->longitude
s zeměpisnou délkou, podle které chcete hledat.
Nahraďte model.latitude
a model.longitude
s modely, které chcete najít v okolí $location
na základě vzdálenosti definované v $radius
.
Vím, že máte funkční vzorec Haversine, ale pokud potřebujete stránkovat, nemůžete použít zadaný kód.
Snad to pomůže.