Получить пользователей Расстояние от широты Долгота - PullRequest
0 голосов
/ 06 сентября 2018

Сначала я хочу показать вам текущую структуру базы данных. Есть две таблицы:

Пользователи

  • ID
  • имя
  • LOCATION_ID

Места

  • ID
  • город
  • ш
  • LNG

Теперь я хочу реализовать API, который получает соседних пользователей и их расстояние. Понравилось соседним пользователям:

{{имя: пользователь1, расстояние: 5 км}, (имя: пользователь2, расстояние: 7 км)}

Это мое местоположение Модель:

public function scopeIsWithinMaxDistance($query, $rsine, $radius = 5)
{
  return $query->selectRaw("*,{$rsine} AS distance")
               ->whereRaw("{$rsine} < ?"[$radius])->orderBy('distance');
}

public static function rsine($coordinates)
{
    return '(6371 * acos(cos(radians(' . $coordinates['latitude'] . ')) 
    * cos(radians(`lat`)) 
    * cos(radians(`lng`) 
    - radians(' . $coordinates['longitude'] . ')) 
    + sin(radians(' . $coordinates['latitude'] . ')) 
    * sin(radians(`lat`))))';
}

public static function convertKMToMiles($dist)
{
    return $dist * 1.609344;
}

Мой контроллер:

   $coordinates = ['latitude' => '28.392200', 'longitude' => '77.320801'];

   $rsine = Location::rsine($coordinates);

   $radius = Location::convertKMToMiles(5);

   $users = User::with(['location' => function ($query) use ($rsine)
   {
      $query->selectRaw("*, {$rsine} AS distance");}])
            ->whereHas('location',function ($query) use ($radius, $rsine) 
           {$query->isWithinMaxDistance($rsine, $radius);})->get();

ВЫХОД: синтаксическая ошибка

"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*,(6371 * acos(cos(radians(28.392200)) \n    * cos(radians(`lat`)) \n    * cos(rad' at line 1 (SQL: select * from `users` where exists (select *, *,(6371 * acos(cos(radians(28.392200)) \n    * cos(radians(`lat`)) \n    * cos(radians(`lng`) \n    - radians(77.320801)) \n    + sin(radians(28.392200)) \n    * sin(radians(`lat`)))) AS distance from `locations` where `users`.`location_id` = `locations`.`id` and (6371 * acos(cos(radians(28.392200)) \n    * cos(radians(`lat`)) \n    * cos(radians(`lng`) \n    - radians(77.320801)) \n    + sin(radians(28.392200)) \n    * sin(radians(`lat`)))) < 8.04672 order by `distance` asc) and `users`.`deleted_at` is null)",
    "exception": "Illuminate\\Database\\QueryException"
...