我的Location
模型之一具有以下作用域。在我的情况下,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
订购,因为它不存在。我该如何解决?