Лучше будет использовать PHP. Расчеты SQL стоят дорого. В некоторых исходных счетах разница может составлять 30 с против 0,04 с;)
public function scopeDistance($query, $from_latitude, $from_longitude, $distance)
{
$between_coords = \App\Services\PlaceServices::calcCoordinates($from_longitude, $from_latitude, $distance);
return $query
->where(function ($q) use ($between_coords) {
$q->whereBetween('places.longitude', [$between_coords['min']['lng'], $between_coords['max']['lng']]);
})
->where(function ($q) use ($between_coords) {
$q->whereBetween('places.latitude', [$between_coords['min']['lat'], $between_coords['max']['lat']]);
});
}
и calcCoodinates ()
public static function calcCoordinates($longitude, $latitude, $radius = 20)
{
$lng_min = $longitude - $radius / abs(cos(deg2rad($latitude)) * 69);
$lng_max = $longitude + $radius / abs(cos(deg2rad($latitude)) * 69);
$lat_min = $latitude - ($radius / 69);
$lat_max = $latitude + ($radius / 69);
return [
'min' => [
'lat' => $lat_min,
'lng' => $lng_min,
],
'max' => [
'lat' => $lat_max,
'lng' => $lng_max,
],
];
}
Тогда просто используйте YourModel::distance($lat, $lon, $km)->get()