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.