Eloquent 按关系列排序

Eloquent sort by relationship column

我有点迷路了,我正在尝试计算离登录用户最近的距离并对任务进行排序。问题是我的纬度和经度在另一个 table (Buildings) 中,它被定义为 Mission 中的关系。 我正在使用 Laravel/Lumen 的 QueryBuilder 从数据库中获取记录。

$orderBy = "DEGREES(ACOS(COS(RADIANS($lat)) * COS(RADIANS(lat)) * COS(RADIANS($lng) - RADIANS(lng)) + SIN(RADIANS($lat)) * SIN(RADIANS(lat))))";
return DB::table('buildings')
       ->join('missions', 'building_id', '=', 'buildings.id')
       ->select('missions.*', 'buildings.lat', 'buildings.lng')
       ->orderBy(DB::raw($orderBy))
       ->get();

结果:

{
  "id": 5,
  "building_id" : 2
   ...
  "created_at": "2016-03-07 07:35:19",
  "updated_at": "2016-03-07 07:35:19",
  "lat": 33,
  "lng": 55
}

但是这个 returns 非常丑陋的响应并且很难处理。由于 MissionBuilding 有关系,我也想将 table 加载到响应中( 而不是显示 building_id ).但是 DB:Table() 这是不可能的(?)

{
  "id": 5,
  "building_id": 2
  "building" : {
      "id": 2
      ...
      "lat": 33,
      "lng": 55
  }
  ...
}

这是我想要得到的回复,并按 lat/lng 排序。 有什么方法可以用 Eloquents 模型做到这一点吗?

这对你有用吗?

$orderBy = "DEGREES(ACOS(COS(RADIANS($lat)) * COS(RADIANS(lat)) * COS(RADIANS($lng) - RADIANS(lng)) + SIN(RADIANS($lat)) * SIN(RADIANS(lat))))";

return Building::join('missions', 'building_id', '=', 'buildings.id')
    ->select(['missions.*', 'buildings.lat', 'buildings.lng'])
    ->with('missions')
    ->orderBy(DB::raw($orderBy))
    ->get();

PS: Don't forget to set the relation in your Building model, unless the with method will fail.