Laravel. При получении расстояния с учетом долготы и широты пользователя я продолжаю получать один и тот же результат для всех моделей. Почему?

У меня есть столбец JSON в моей базе данных, в котором хранятся координаты долготы и широты, настроенные как:

_geoloc:{lat: 33.6556324, lng: -117.7015161}. 

Я пытаюсь запросить базу данных с координатами долготы и широты пользователя, чтобы получить все записи, которые попадают на определенное расстояние. Ниже приведена функция, которую я использую, однако все результаты возвращают одно и то же расстояние 7797,5012454514 для каждой модели. Я хотел бы передать параметр $distance в милях.

protected function get_locations( $latitude, $longitude, $distance = 8000 ) {
    $results= my_table::select( 'my_table.*' )
        ->selectRaw( '(3959 * (acos( cos( radians(?) )
            * cos( radians( "_geoloc->lat" ) )
            * cos( radians( "_geoloc->lng" ) - radians(?))
            + sin( radians( ? ) )
            * sin( radians( "_geoloc->lat" ) ) ) ) )
        AS distance', [ $latitude, $longitude, $latitude ] )
        ->havingRaw( "distance< ?", [ $distance ] )
        ->groupBy( 'first_name' )
        ->get();
    return $results;
}

person brandon-estrella-dev    schedule 17.11.2017    source источник


Ответы (1)


В случае, если кто-то еще столкнется с той же проблемой. Решение требует использования JSON_EXTRACT в запросе вместе с символом $ для токенизации объекта.

protected function get_locations( $latitude, $longitude, $distance = 20 ) {
    $results = ( new my_table)->having( 'distance', '<', $distance )
                                      ->select( DB::raw( "*,
                 (3959 * ACOS(COS(RADIANS($latitude))
                       * COS(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat')))
                       * COS(RADIANS($longitude) - RADIANS(JSON_EXTRACT(`_geoloc`,'$.lng')))
                       + SIN(RADIANS($latitude))
                       * SIN(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))))) AS distance" )
                                      )->orderBy( 'distance', 'asc' )
                                      ->get();
    return $results
}
person brandon-estrella-dev    schedule 18.11.2017