Сейчас я использую этот запрос для получения ближайших записей:
public function scopeNearby($query, $lat, $long, $distance = 10)
{
if($lat AND $long) {
// 3959 for miles, 6371 for kilometers
$distanceQuery = '(6371 * acos(cos(radians(?)) * cos(radians(geo_lat)) * ' .
'cos(radians(geo_long) - radians(?)) + sin(radians(?)) ' .
'* sin(radians(geo_lat))))';
return $query->select('*', DB::raw("{$distanceQuery} as distance"))
->addBinding([$lat, $long, $lat], "select")
->whereNotNull('geo_lat')
->whereNotNull('geo_long')
->whereRaw("{$distanceQuery} < ?")
->addBinding([$lat, $long, $lat, $distance], "where")
->orderBy('distance', "ASC");
}
}
Вы можете заметить, что я использовал $distanceQuery
как для предложений SELECT
, так и WHERE
.В настоящее время у меня возникают проблемы, когда эта область используется вместе с методом paginate()
.Это может потребовать некоторого рефакторинга, но сейчас вы можете сделать то же самое.