按一定规则对口才集合进行排序

时间:2018-11-03 10:48:08

标签: php sorting eloquent laravel-5.2

我的数据库中有一个名为users的表,并且已经创建了一个模型User。我数据库中的每个用户都有特定的latitudelongitude。因此,我想根据用户的位置对他们进行排序。例如: 假设我的一位用户的纬度为34.567,经度为56.983。现在,我想显示所有纬度和经度与我的纬度非常接近的用户。假设:34.975和56.884。因此,我想显示位置接近我的用户位置的特定用户。因此,我该如何在Laravel中进行排序。

  

注意:是的,这个问题没有代码。但是,我已经在文档中搜索了类似的内容,但是他们有针对特定情况的文档,例如sorting on the basis of posted time and so on.,谢谢。

1 个答案:

答案 0 :(得分:0)

用于按距离排序的通用PHP代码:

// Get the requested latitude and longitude (from whatever source)
$lat = $coords['latitude'];
$lng = $coords['longitude'];
$distance = 81; // Radius of distance in kilometers

$earthRadius = 6731; // accepted mean radius of the Earth in kilometres

if ($distance == 0) {
    $distance = 81; // Default to 50 miles (in km) if no distance given!
}

$latDistance = $distance / 111.325;
$lngDistance = (cos(abs($lat)) * $distance) / 111.325;
$minLat = $lat - $latDistance;
$maxLat = $lat + $latDistance;
$minLng = $lng - $lngDistance;
$maxLng = $lng + $lngDistance;

$boundaryCalculation = "(users.latitude >= {$minLat} AND users.latitude <= {$maxLat} AND users.longitude >= {$minLng} AND users.longitude <= {$maxLng})";

$distanceCalculation = "(ACOS(SIN({$lat}*PI()/180) * SIN(users.latitude*PI()/180) + (COS({$lat}*PI()/180)*COS(users.latitude*PI()/180) * COS((({$lng}-users.longitude)*PI()/180)))) * {$earthRadius})";

// Create the query
// Note, should be parameterized but this gives the idea
$query = "SELECT * FROM users WHERE " . $boundaryCalculation . " AND " . $distanceCalculation;

这提供了很好的介绍:https://www.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL

请注意,从5.7版开始,MySQL提供了一个内置函数来计算球面上两个点之间的距离。可能有用!

https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html