Esta fue mi implementación de la misma. Elegí crear un alias para mi consulta con anticipación, de esta manera puedo aprovechar la Pagination . Además, debe seleccionar explícitamente las columnas que desea recuperar de la consulta. agréguelos en ->select() . Como users.latitude, users.longitude, products.name , o lo que sea.
He creado un alcance que se parece a esto:
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]);
}
Puede aplicar este alcance a cualquier modelo con una latitude y longitude .
Reemplace $location->latitude con tu latitude que desea buscar y reemplace el $location->longitude con la longitud contra la que desea buscar.
Reemplace model.latitude y model.longitude con los modelos que desea encontrar alrededor de la $location basado en la distancia definida en el $radius .
Sé que tiene una fórmula de Haversine que funciona, pero si necesita Paginar, no puede usar el código que proporcionó.
Espero que esto ayude.