реализация запроса расстояния haversine на основе lng и lat

Я столкнулся с проблемой при разработке этого.

У меня реализована эта функция области видимости, что я работаю на модели, как

Listing :: closest ($ lat, $ lng) -> paginate (5);

public function scopeClosest($query, $lat, $lng, $distance = 0, $units = 'km')
{

switch ( $units ) {
case 'miles':
//radius of the great circle in miles
$gr_circle_radius = 3959;
break;
case 'km':
//radius of the great circle in kilometers
$gr_circle_radius = 6371;
break;
}

return $query->selectRaw(
'*, ( '.$gr_circle_radius.' * acos( cos( radians('.$lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('.$lng.') ) + sin( radians('.$lat.') ) * sin( radians( lat ) ) ) ) AS distance'
)->havingRaw("distance < ?", [10] );

}

Однако я сталкиваюсь с этой ошибкой, которую я не знаю, как исправить

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «расстояние» в «имеющем предложении» (SQL: выберите количество (*) в качестве агрегата из listings имея расстояние < 10)

Похоже, что laravel выполняет 2 запроса, вот как это выглядит, если я не использую haveRaw ()

array:2 [▼
0 => array:3 [▼
"query" => "select count(*) as aggregate from `listings`""bindings" => []
"time" => 0.48
]
1 => array:3 [▼
"query" => "select *, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance from `listings` limit 5 offset 0""bindings" => []
"time" => 0.97
]
]

Когда я использую hasRaw, кажется, что laravel применяет его к первому запросу, и, конечно, он потерпит неудачу. Но почему он применяется к первому запросу, а не ко второму?

0

Решение

Это то, что я сделал в моем случае … Мне нужно запросить расстояние, которое было в радиусе 5 км. я использовал whereRaw вместе с paginate

$vtl = VehicleTrackerLog::whereRaw("(
111.1111
*DEGREES(ACOS(COS(RADIANS('-33.873415'))
* COS(RADIANS(lat))
* COS(RADIANS('151.227538' - lng))+ SIN (RADIANS('-33.873415'))
* SIN(RADIANS(lat))))<=5)")->paginate(5);

Если вы хотите в милях, просто умножьте на 69.041236 вместо 111.111

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]