2017-02-14 2 views
0

Я пытался показать расстояние для результатов моего поискаДобавление расстояния к результатам запроса

код и запрос

$query = DB::select(DB::raw('SELECT id, (3959 * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $lng . ')) + sin(radians(' . $lat .')) * sin(radians(latitude)))) AS distance FROM listings HAVING distance < ' . $distance . ' ORDER BY distance')); 
     foreach($query as $q) 
     { 
      array_push($ids, $q->id); 

     } 
     $placeholders = implode(',',array_fill(0, count($ids), '?')); 
     $listings = Listing::whereIn('id', $ids)->orderByRaw("field(id,{$placeholders})", $ids)->paginate(10); 

$ запрос содержит расстояние.

Как добавить расстояние до результатов поиска?

ответ

0

Приложите запрос выбора расстояния также к красноречивому запросу.

Используйте следующий подход;

Listing::select([ 
    "*", 
    "(3959 * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $lng . ')) + sin(radians(' . $lat .')) * sin(radians(latitude)))) AS distance" 
])...... 

Кроме того, почему бы вам не использовать результаты первого запроса, вам не нужно дважды выполнить тот же запрос.

+0

$ перечислений = Листинг :: выберите ([ \t \t \t "*", \t \t \t «(3959 * ACOS (соз (radians ('. $ lat.')) * cos (радиан (широта)) * cos (радианы (долгота) - радианы ('. $ lng.')) + sin (радиан ('. $ lat.')) * sin (радиан (широта)))) AS расстояние " \t \t \t]) -> имея ('расстояние', '<', $ distance) -> orderBy ('distan се ') -> получить(); Я получаю ошибки –

+0

SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса, используемого рядом с '* from 'listings' с' distance'

+0

Укажите имя таблицы со списком звездочек. * " –

0

Если вы хотите, чтобы получить результат для любого определенного расстояния:

$radius = 15; 
Listing::select(
     DB::raw("*, (6371 * acos(cos(radians('".$lat."')) * cos(radians(latitude)) * cos(radians(longitude) - radians('".$lon."')) + sin(radians('".$lat."')) * sin(radians(latitude)))) AS **distance**" 
      ) 
     ) 
     ->having("distance", "<", $radius) 
     ->orderBy("distance") 
     ->get(); 
Смежные вопросы