php - Laravel 根据距离对用户集合进行排序
问题描述
public function nearby()
{
$user = auth()->user();
$lat = auth()->user()->latitude;
$lon = auth()->user()->longitude;
$radius = 3; // km => converted to meter
$angle_radius = (float)$radius / ( 111 * cos( (float)$lat ) ); // Every lat|lon degree° is ~ 111Km
$min_lat = (float)$lat - (float)$angle_radius;
$max_lat = (float)$lat + (float)$angle_radius;
$min_lon = (float)$lon - (float)$angle_radius;
$max_lon = (float)$lon + (float)$angle_radius;
$persons = User::where('status', STATUS::ACTIVE)
->where('id', '!=', $user->id)
->whereBetween('latitude', [$min_lat, $max_lat])
->whereBetween('longitude', [$min_lon, $max_lon])
->get();
$persons->each(function($person) {
/* auth user coordinate vs user's coordinates */
$point1 = array('lat' => auth()->user()->latitude, 'long' => auth()->user()->longitude);
$point2 = array('lat' => $person->latitude, 'long' => $person->longitude);
$distance = $person->getDistanceBetweenPoints($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);
$person['distance'] = $distance;
});
return $persons;
}
我正在根据用户的经度/纬度搜索半径 3 公里内的用户。我正在将 auth long/lat 与附近的用户 long/lat 进行比较。它返回具有距离的用户集合。
现在我无法按距离对其进行排序。
如果我添加 orderBy('distance', 'desc') 当然会导致错误,因为我的数据库上没有距离列。
他们是一种对其进行排序和分页的方法。
解决方案
该$persons
变量是一个集合对象,您可以使用此处文档中的集合方法:https ://laravel.com/docs/5.6/collections#available-methods
您可以使用sortBy
集合对象的功能。
laravel 的分页是在数据库查询级别(https://laravel.com/docs/5.6/pagination),所以你可以使用 eloquent 的orderBy
方法。
如果您想完成这项工作,distance
请在 users 表中放置一列,但我认为您不希望这样做,因为您以编程方式计算getDistanceBetweenPoints
.
我想到的另一个解决方案是为每个用户的距离创建一个单独的表。
您必须想出一个解决方案,在数据库查询级别对距离进行排序。
希望这将帮助您解决您的问题:纬度/经度查找最近的纬度/经度 - 复杂的 sql 或复杂的计算
推荐阅读
- vb.net - VB.Net and Multiselect Box
- php - 如何使用 php 脚本将百万行插入 MySQL 数据库?
- list - 右手边也被分配
- ruby-on-rails - 使用回形针将图像上传到目录 - Ruby on rails
- python - 捕获 QApplication 中引发的异常
- java - 尝试通过 Odata 服务连接时 ErpConfigContext 和 ODataQueryBuilder 抛出错误
- pandas - 我希望 train_test_split 主要在一个特定的数字范围内进行训练
- python - 有没有一种并行的方法来比较两个大的整数列表?
- javascript - JavaScript 中的堆栈帧和执行上下文是否相同?
- routes - 角度 7 参数