我的一个Location模型具有以下范围。就我而言, a与Shop有one to many关系Locations。有Location纬度和经度。$latitude, $longitude, $radius来自搜索字段。我正在尝试按与正在搜索的用户Shop的距离进行排序。Location
public function scopeCloseTo($query, $latitude, $longitude, $radius = 25)
{
$haversine = "(3959 * acos(cos(radians($latitude))
* cos(radians(latitude))
* cos(radians(longitude)
- radians($longitude))
+ sin(radians($latitude))
* sin(radians(latitude))))";
return $query
->select('*')
->selectRaw("{$haversine} AS distance")
->whereRaw("{$haversine} < ?", [$radius]);
}
我正在使用它
return Shop::with(['locations' => function ($query) use ($latitude, $longitude, $radius) {
$query->closeTo($latitude, $longitude, $radius);
}])->whereHas('locations', function ($query) use ($latitude, $longitude, $radius) {
$query->closeTo($latitude, $longitude, $radius);
});
这很好用,它可以让我找到一定半径内的所有商店。
然后我想做的是Shops按距离排序。
添加orderBy到closeTo闭包中只需订购locations. 您不能订购,Distance因为Shop它不存在。我该如何解决?