2017-02-14 109 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(COS(弧度('。$ lat。'))* cos(弧度(纬度))* cos(弧度(经度) - 弧度('。$ lng。'))+ sin(弧度('。$ lat。'))* sin(radians(latitude))))AS distance“ \t \t \t] - > having('distance','<',$ distance) - > orderBy('distan CE“) - >获得(); 我收到错误 –

+0

SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法错误;检查与您的MariaDB服务器版本相对应的手册,以找到正确的语法,以便在'距离'''''''''''''''距离'<?在第1行用'distance' asc'命令(SQL:select *,'('as'from'listings'''distance' <5 order by'distance' asc) –

+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();