Това беше моето изпълнение. Избрах да направя псевдоним на заявката си преди време, по този начин мога да се възползвам от Pagination
. Освен това трябва изрично да изберете колоните, които искате да извлечете от заявката. добавете ги в ->select()
. Като например users.latitude, users.longitude, products.name
, или каквито и да са те.
Създадох обхват, който изглежда нещо подобно:
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]);
}
Можете да приложите този обхват към всеки модел с latitude
иlongitude
.
Заменете $location->latitude
с вашата latitude
по които искате да търсите, и заменете $location->longitude
с географската дължина, срещу която искате да търсите.
Заменете model.latitude
и model.longitude
с моделите, които искате да намерите около $location
въз основа на разстоянието, дефинирано в $radius
.
Знам, че имате функционираща формула на Haversine, но ако трябва да разделите на страници, не можете да използвате кода, който сте предоставили.
Надяваме се това да помогне.