Используйте функцию php с красноречивыми запросами в laravel - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть модель 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 функциями, что является лучшим решением? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...