首页 > 解决方案 > Laravel:按关系 AS 列按父级排序

问题描述

我的一个Location模型具有以下范围。就我而言, a与Shopone 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按距离排序。

添加orderBycloseTo闭包中只需订购locations. 您不能订购,Distance因为Shop它不存在。我该如何解决?

标签: laraveleloquent

解决方案


推荐阅读