【问题标题】:Laravel Sorting user collection based by distanceLaravel 根据距离对用户集合进行排序
【发布时间】:2019-02-21 03:45:36
【问题描述】:
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') 当然会导致错误,因为我的数据库中没有距离列。

是他们对它进行排序和分页的一种方式。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    $persons 变量是一个集合对象,您可以使用此处文档中的集合方法:https://laravel.com/docs/5.6/collections#available-methods

    可以使用集合对象的sortBy函数。


    laravel 的分页是在数据库查询级别(https://laravel.com/docs/5.6/pagination),所以你可以使用 eloquent 的orderBy 方法。

    如果您想完成这项工作,请在 users 表中添加一个 distance 列,但我认为您不希望这样做,因为您以编程方式计算 getDistanceBetweenPoints 中的距离。

    我想到的另一个解决方案是为每个用户的距离创建一个单独的表。

    您必须想出一种解决方案,在数据库查询级别对距离进行排序。


    希望这能帮助您解决问题:latitude/longitude find nearest latitude/longitude - complex sql or complex calculation

    【讨论】:

    • 我没有在文档中看到如何分页。是他们的一种方式吗?
    【解决方案2】:

    这可能会有所帮助。

     $persons->sortBy('distance');
        return $persons;
    

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2017-06-03
      • 2018-03-05
      • 1970-01-01
      • 2015-12-12
      • 2021-01-23
      相关资源
      最近更新 更多