Я пытаюсь сравнить местоположение пользователя (отправлено с помощью параметров в URL-адресе) с offer.offer_lat и offer.offer_long (в моей БД) по аргументу расстояния (в милях)
Сейчас я схожу с ума, многие решения, которые я нашел в Интернете, с трудом переносятся на конструктор запросов laravels с использованием DB :: raw, в настоящее время у меня есть функция в области запросов, поскольку пользователь будет фильтровать результаты API с помощью расстояние, не повезло, хотя!
Я нашел некоторые функции в Интернете для расчета haversine, но я не знаю, как их использовать. Вот пример:
https://gist.github.com/fhferreira/9081607
Любая помощь будет высоко ценится! 🙂
Спасибо
Таким образом, вам не нужно все наворот, который находится в этой сути, вместо этого вы можете использовать следующие формулы:
public function get_offers_near($latitude, $longitude, $radius = 1){
$offers = Offer::select('offers.*')
->selectRaw('( 3959 * acos( cos( radians(?) ) *
cos( radians( offer_lat ) )
* cos( radians( offer_long ) - radians(?)
) + sin( radians(?) ) *
sin( radians( offer_lat ) ) )
) AS distance', [$latitude, $longitude, $latitude])
->havingRaw("distance < ?", [$radius])
->get();
return $offers;
}
Это предполагает, что вы передаете в latitude
а также longitude
от вашего пользователя. Кроме того, если вы не хотите, чтобы радиус был равен 1, вы можете передать третий аргумент и указать собственный радиус.
И, конечно, мы предполагаем, что это для модели Offer
, При необходимости измените соглашение об именах.
Других решений пока нет …