Laravel Сортировка пользователей по расстоянию - PullRequest
0 голосов
/ 17 сентября 2018
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.Он возвращает коллекции пользователя с расстоянием.

enter image description here

Теперь у меня проблемы с сортировкой по расстоянию.

Если я добавляю orderBy ('distance', 'desc'), конечно, это приведет к ошибке, потому что у меня нет столбца расстояния в моей БД.

Это способ сортировки и разбивки на страницы.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это может помочь.

 $persons->sortBy('distance');
    return $persons;
0 голосов
/ 17 сентября 2018

Переменная $persons является объектом коллекции, вы можете использовать методы сбора, найденные в документации здесь: https://laravel.com/docs/5.6/collections#available-methods

Вы можете использовать функцию sortBy объекта коллекции.


Нумерация страниц laravel находится на уровне запросов к базе данных (https://laravel.com/docs/5.6/pagination),, так что вы можете использовать метод eloquent orderBy.

Если вы хотите, чтобы это работало, поставьте distance в таблице пользователей, но я думаю, что вы не хотите этого, потому что вы программно вычисляете расстояние в getDistanceBetweenPoints.

Другое решение, о котором я думаю, - это создать отдельную таблицу для расстоянийкаждый пользователь.

Вы должны подумать о решении, которое будет сортировать расстояние на уровне запросов к базе данных.


Надеюсь, это поможет вам решить вашу проблему: широта / долготанайти ближайшую широту / долготу - комплексный sql или комплексный расчет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...