如何获得附近的用户和距离?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获得附近的用户和距离?相关的知识,希望对你有一定的参考价值。
首先,我想向您展示当前的数据库结构。有两个表:
用户
- ID
- 那么
- LOCATION_ID
地点
- ID
- 市
- 岁月
- LNG
现在我想实现一个API来获取附近的用户和他们的距离。喜欢附近的用户:
{{name:user1,distance:5km},(name:user2,distance:7 km)}
答案
你可以这样试试
用户模型
public function location(){
return $this->belongsTo('AppLocation');
}
在Location模型中创建一个函数名称rsine
然后创建一个以scopeIsWithinMaxDistance
命名的本地作用域
位置模型
/**
* Scope for adding distance filter
*/
public function scopeIsWithinMaxDistance($query, $rsine, $radius = 5)
{
return $query->selectRaw("*, {$rsine} AS distance")
->whereRaw("{$rsine} < ?", [$radius])
->orderBy('distance');
}
/**
* Sql command for finding distance between 2 coordinates
*/
public static function rsine($coordinates)
{
return '(6371 * acos(cos(radians(' . $coordinates['latitude'] . '))
* cos(radians(`lat`))
* cos(radians(`lng`)
- radians(' . $coordinates['longitude'] . '))
+ sin(radians(' . $coordinates['latitude'] . '))
* sin(radians(`lat`))))';
}
public static function convertKMToMiles($dist)
{
return $dist * 1.609344;
}
现在在控制器中调用它
$coordinates = ['latitude' => '28.392200', 'longitude' => '77.320801'];
$rsine = Location::rsine($coordinates);
$radius = Location::convertKMToMiles(5); //convert KM to miles
$users = User::with(['location' => function ($query) use ($rsine) {
$query->selectRaw("*, {$rsine} AS distance");
}])->whereHas('location', function ($query) use ($radius, $rsine) {
$query->isWithinMaxDistance($rsine, $radius);
})->get();
现在你可以像这样打印
foreach($users as $user){
$user->name;
$user->location->city;
$user->location->distance;
}
以上是关于如何获得附近的用户和距离?的主要内容,如果未能解决你的问题,请参考以下文章