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

Php Laravel 4:如何将这个复杂的原始地理SQL查询转换为使用Elounting?,php,mysql,laravel,eloquent,geographic-distance,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 ) ) ) ) A

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

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;

但是我很困惑,我应该如何使用Eloquent指定问号来表示我的输入纬度和经度,以及如何继续链接我的order by子句和我的限制?

在我的一个项目中使用了相同的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();

这种方法允许我在这个复杂的查询中附加一些额外的过滤、分页等。

到目前为止有错误消息吗?对于orderBy,您可以使用f.ex.:$query->orderBy'id'、'DESC';我甚至无法正确执行查询的selectRaw部分。我收到一个无效的参数号错误。是的,非常好-我已经修改了你的代码以满足我的需要。看起来DB::raw是实现这一点的唯一合理方法。干杯,伙计。
 $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();