Laravel Orderby Calculated Value


Laravel Orderby Calculated Value

我有这个函数,它应该按距离返回值,越近越远。然而,在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:原始,但不确定如何合并(如果必须的话)。。。感谢您的帮助,谢谢。

您应该使用雄辩的**DB::raw()**函数。

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

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

更多DB::原始用法示例

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

帮助太晚了(但对子孙后代来说):你不想在原始SQL中使用勾股方程吗?

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

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