Laravel 4:如何将这个复杂的原始地理SQL查询转换为使用Eloquent?

时间:2014-10-23 12:01:54

标签: php mysql laravel eloquent geographic-distance

所以我试图在一定距离内找到距离另一个特定点的最近点,并且我使用了半身式公式。原始查询本身是:

SELECT id, 
( 3959 * acos( cos( radians(input_lat) ) * cos( radians( map_loc_lat ) ) * cos( radians( map_loc_long ) - radians(input_long) ) + sin( radians(input_lat) ) * sin( radians( map_loc_lat ) ) ) ) 
AS distance FROM posts HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

input_latinput_long是我希望我的中心搜索点开始的预定义坐标,而map_loc_latmap_loc_longposts& #39;点。

我试图使用Eloquent的selectRaw()方法来完成一部分繁重的工作,如下所示:

$query->selectRaw('id,  ( 6371 * acos( cos( radians(?) ) * cos( radians( map_loc_lat ) )
  * cos( radians( ? ) - radians(?) ) + sin( radians(?) ) 
  * sin( radians( map_loc_lat ) ) ) ) AS distance', )

但是我对如何使用Eloquent指定问号以指示我的输入纬度和经度感到困惑,再加上我将如何继续链接我的订单和我的限制?

1 个答案:

答案 0 :(得分:4)

在我的一个项目中使用相同的sql。没有找到任何其他解决方案,而不是使用DB::raw()select()

以下是示例:

 $distance = Input::get('distance', 0.1);
 $lat = Input::get('latitude');
 $lng = Input::get('longitude');
 $select="drops.*,(6371 * acos( cos( radians({$lat}) ) * cos( radians( drops.latitude ) ) * cos( radians( drops.longitude ) - radians({$lng}) ) + sin( radians({$lat}) ) * sin( radians(drops.latitude) ) )) AS distance";
 $drops_query = DB::table('drops')->select(DB::raw($select))
                    ->addSelect('users.login as username')
                    ->leftJoin('users', 'users.id', '=', 'drops.user_in')
                    ->where('drops.latitude','<>','')
                    ->where('drops.longitude','<>','');
 $drops_query = $drops_query->having('distance', '<=', $distance)->orderBy('distance','DESC');
 $drops = $drops_query->take($limit)->get();

这种方法让我可以在这个复杂的查询中附加一些额外的过滤,分页等等。