Example showing Product
with max distance radius
from latitude
and longitude
- Model Query Scope
public function scopeIsWithinMaxDistance($query, $latitude, $longitude, $radius = 25)
{
// for miles you'd use 3961 instead of 6371 (Kilometer)
$sql = "(6371 * acos(cos(radians($latitude))
* cos(radians(address.latitude))
* cos(radians(address.longitude)
- radians($longitude))
+ sin(radians($latitude))
* sin(radians(address.latitude))))";
return $query
->select('*')
->selectRaw("{$sql} AS distance")
->whereRaw("{$sql} < ?", [$radius]);
}
- Controller
$latitude = '-6.121435';
$longitude = '106.774124';
$radius = 7;
$x = Product::whereHas('address', function ($query) use ($latitude, $longitude, $radius) {
$query->isWithinMaxDistance($latitude, $longitude, $radius);
})->with('address')->get();