我有这个函数应该按距离返回值,离更近的距离。但是在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但不确定如何合并(如果必须的话)...感谢帮助,谢谢。
答案 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'
)
您想要订购的实际距离是半径(斜边),对吗?