按关系列排序的雄辩排序

时间:2016-03-07 14:16:51

标签: laravel eloquent lumen

我有点迷茫,我正在尝试计算最接近登录用户的距离和排序任务。问题是我的lat和lng位于另一个表(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
}

但这会带来非常难看的反应并且难以使用。由于MissionBuilding有关系,我想将该表加载到响应中(而不是显示building_id )。但是使用DB:Table(),这是不可能的(?)

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

这是我想要的响应,并按lat / lng排序。 有没有办法用Eloquents模型做到这一点?

1 个答案:

答案 0 :(得分:2)

这对你有用吗?

$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 :除非Building方法失败,否则不要忘记在with模型中设置relation