【发布时间】:2017-12-17 12:04:13
【问题描述】:
经过一夜的折腾,我设法让用户按距离进行搜索!我多年来一直想实现的目标。但是我还有另一个问题。我无法按距离对它们进行排序。
我有一个用户表。每个用户都有一个“国家”、“州”、“邮政编码”和“郊区”。
我还有一个包含以下字段的位置表。
“国家”、“州”、“邮政编码”和“郊区”、经度、纬度
我设法破解了一个按距离顺序返回所有地点的查询。但现在我想按距离顺序返回该郊区、邮政编码、州和国家/地区的所有用户。
这是我目前的代码,我不知道如何修改它。
//spatial queries
static function cmp($user1, $user2)
{
global $places;
foreach($places as $place)
{
if(($place->country == $user1->country) && ($place->suburb == $user1->suburb) && ($place->state == $user1->state))
{
return true;
}
if(($place->country == $user2->country) && ($place->suburb == $user2->suburb) && ($place->state == $user2->state))
{
return false;
}
}
return false;
}
public function search()
{
if (Auth::guest())
{
return Redirect::guest('/');
}
else
{
if ( Session::token() !== request( '_token' ) ) {
return Response::json( array(
'searcherror' => 'Invalid Authorization Token'
) );
}
//identify the right query (make sure later: if you arent what they are looking for, they dont show up. If you are blocked, they dont show up)
if(request('country') && request('lfmin') && request('lfmax'))
{
//main requirements exist
if(!request('state') && !request('suburb') && !request('postcode') && request('distance'))
{
//spatial queries
//$circle_radius = 3959; //miles
$circle_radius = 6371; //kms
$max_distance = request('distance');
$lat = Auth::user()->getLoc()->latitude;
$lng = Auth::user()->getLoc()->longitude;
//get all nearby places
$places = DB::select(
'SELECT * FROM
(SELECT id, country, suburb, state, latitude, longitude, (' . $circle_radius . ' * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) *
cos(radians(longitude) - radians(' . $lng . ')) +
sin(radians(' . $lat . ')) * sin(radians(latitude))))
AS distance
FROM places) AS distances
WHERE distance < ' . $max_distance . '
ORDER BY distance;
');
/*
$result = User::contains('country', $places->country)
->contains('state', $places->state)
->contains('postcode', $places->postcode)
->contains('suburb', $places->suburb)
->get();
*/
$countryarray = [];
$suburbarray = [];
$statearray = [];
foreach($places as $place)
{
//get country array
//get state array
//get suburb array
array_push($countryarray, $place->country);
array_push($suburbarray, $place->suburb);
array_push($statearray, $place->state);
}
$places = (object)$places;
$users = User::whereIn('suburb', $suburbarray)
->whereIn('country', $countryarray)
->whereIn('state', $statearray)->get();
//put this somewhere useful later remember usort(array,'cmp')
$users = $users->toArray(); // Convert user collection to array
//static
usort($users, array("App\Http\Controllers\SearchController", "cmp"));
return Response::json( array(
'searcherror' => $users
) );
}
编辑:试过了,固定类路径得到了这个
为 foreach() 提供的参数无效
您的排序功能有问题
注意:用户位置以及经纬度可以通过用户对象中的方法访问
$user->getLoc() 所以基本上我们可以像这样访问它,例如 $user->getLoc()->经度
【问题讨论】: