Сортировать Eloquent коллекцию по определенному правилу - PullRequest
0 голосов
/ 03 ноября 2018

В моей базе данных есть таблица с именем users, и я создал модель User. У каждого пользователя в моей базе данных есть определенные latitude и longitude. Итак, я хочу отсортировать пользователей в зависимости от их местоположения. Примером этого может быть: Допустим, один из моих пользователей имеет широту 34,567 и долготу 56,983. Теперь я хочу отобразить всех пользователей, широта и долгота которых очень близки к моим. Допустим, 34,975 и 56,884. Итак, я хочу отобразить тех конкретных пользователей, чье местоположение близко к местоположению моего пользователя. Итак, как мне сделать сортировку в Laravel.

Примечание. Да, код с вопросом отсутствует. Но я искал в документации что-то подобное, но у них есть документация для конкретных случаев, таких как sorting on the basis of posted time and so on. Спасибо.

1 Ответ

0 голосов
/ 03 ноября 2018

Довольно общий 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

...