2014-02-10 70 views
0

我目前正在试图建立一个原始查询检索在附近,这里是我的尝试laravel 4原始查询错误

$places = DB::select('select * from b_details where(3959 * acos(cos(radians(37)) * cos(radians(lat = ?)) * cos(radians(lng = ?) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) 
as distance from b_details having distance < radius = ? order by distance LIMIT 0 , 20', array($lat, $lng, $radius)); 

我也试过:

$disctance_select = sprintf(
     "(3959 * acos(cos(radians(%s)) " . 
     " * cos(radians(lat)) " . 
     " * cos(radians(lng) - radians(%s)) " . 
     " + sin(radians(%s)) * sin(radians(lat)) " . 
     ") " . 
     ") " . 
     "AS distance", 
     $lat, 
     $lng, 
     $lat 
    ); 

    return DB::table('b_details') 
     ->having('distance', '<', $radius) 
     ->orderBy('distance', 'ASC') 
     ->get(array('*',$disctance_select)); 

这样可以使产生错误:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax 

这是我试图使用复制与laravel 4查询:

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

任何帮助表示赞赏,谢谢。

+0

请检查下面Mr.Joe答案 –

回答

1

请检查: 它确实工作:)

$result = Listing::select(
      DB::raw("*, 
          (6371 * acos(cos(radians(?)) * 
          cos(radians(lat)) 
          * cos(radians(lon) - radians(?) 
          ) + sin(radians(?)) * 
          sin(radians(lat))) 
         ) AS distance")) 
      ->having("distance", "<", $radius) 
      ->orderBy("distance") 
      ->setBindings([$lat, $lon, $lat]) 
      ->get(); 
0

您已完成select *后跟where后跟calculated column。您需要将distance计算列放在where子句之前。

为什么你不只是粘贴你试图复制的查询作为第一个参数在Laravel DB:select?我很困惑你为什么要改变它。