У меня есть модель Location
, и она имеет отношение один к одному с другой моделью Address
с такими атрибутами, как latitude
и longitude
, и я работаю над конечной точкой, чтобы получить список местоположений исходя из их расстояния до пользователя. Так что мой GET
запрос, например, выглядит примерно так: /locations?latitude=70.00&longitude=-80.01
.
. В моем LocationController
у меня уже есть функция типа haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo)
, которая принимает 4 аргумента как float и возвращает расстояние до пользовательского ввода. расположение как поплавок.
function haversineGreatCircleDistance(
$latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, isMile = false) {
if ($isMile) {
$earthRadius = self::EARTH_RADIUS_IN_MILE;
else {
$earthRadius = self::EARTH_RADIUS_IN_KM;
}
$dLat = deg2rad($latitudeTo - $latitudeFrom);
$dLon = deg2rad($longitudeTo - $longitudeFrom);
$a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitudeFrom)) * cos(deg2rad($latitudeTo)) * sin($dLon/2) * sin($dLon/2);
$c = 2 * asin(sqrt($a));
$d = $earthRadius * $c;
return $d;
}
Мой вопрос: как мне использовать эту функцию как часть моего красноречивого запроса, чтобы получить расстояние? Мой красноречивый запрос в настоящее время выглядит примерно так:
$distance = self::haversineGreatCircleDistance($latitude, $longitude, 'latitude', 'longitude') . ' AS distance';
$query = Location::select('*', \DB::raw($distance))
->with('address')
->sortBy('distance');
Однако он не работает, и все рассчитанные расстояния такие же, как если бы вторые параметры latitude
и longitude
были равны 0. И если нет никакого способа чтобы запрос работал с php функциями, что является лучшим решением? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Большое спасибо!