Laravel Orderby计算值

时间:2015-02-19 08:28:59

标签: php mysql laravel

我有这个函数应该按距离返回值,离更近的距离。但是在Laravel中接收到这个错误:使用未定义的常量lat - 假设'lat'

代码如下:

public static function getNearby($lat, $lng, $distance = 50, $limit = 50) {

    $radius = 6371.009; // Earths radius in KM

    // Latitude Boundaries
    $minLat = (float) $lat - rad2deg($distance / $radius);
    $maxLat = (float) $lat + rad2deg($distance / $radius);

    // Longitude Boundaries
    $minLng = (float) $lng - rad2deg($distance / $radius / cos(deg2rad((float) $lat)));
    $maxLng = (float) $lng + rad2deg($distance / $radius / cos(deg2rad((float) $lat)));

    // Query DB
    $nearby = (array) DB::table('users')
        ->where('lat', '>', $minLat)
        ->where('lat', '<', $maxLat)
        ->where('lng', '>', $minLng)
        ->where('lng', '<', $maxLng)
        ->orderBy(ABS(lat - (float) $lat) + ABS(lng - (float) $lng), 'ASC')
        ->take($limit)
        ->get(); 

    var_dump($nearby);

}

这里有什么建议吗?我设想我可能要做一个DB:raw但不确定如何合并(如果必须的话)...感谢帮助,谢谢。

2 个答案:

答案 0 :(得分:7)

您应该使用eloquent的**DB::raw()**功能。

在您的情况下,以下查询应该有效:

->orderBy(DB::raw('ABS(lat - '.(float)$lat.') + ABS(lng - '.(float)$lng.')'),'ASC' )

更多DB :: raw用法示例

User::select(DB::raw('count(*) as user_count, status'))->first();
User::select(DB::raw('count(*) as user_count'),'status')->first();
User::select(DB::raw(1))->first();

答案 1 :(得分:0)

太晚了,无法帮助(但对后人而言):你不想将毕达哥拉斯方程用于原始SQL吗?

->orderBy(
  DB::raw('SQRT( POWER(lat - ' . (float)$lat . ', 2) + POWER(lng - ' . (float)$lng . ', 2) )',
  'asc'
)

您想要订购的实际距离是半径(斜边),对吗?