【问题标题】:Eloquent sort by relationship columnEloquent 按关系列排序
【发布时间】:2016-06-21 03:18:25
【问题描述】:

我有点迷路了,我正在尝试计算距离登录用户最近的距离和排序任务。问题是我的 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 模型做到这一点?

【问题讨论】:

    标签: laravel eloquent lumen


    【解决方案1】:

    这对你有用吗?

    $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模型中设置relation,除非with方法会失败。

    【讨论】:

    • 啊,是的,谢谢。它确实奏效了!但不得不将订单更改为Mission::select(...) 谢谢!
    猜你喜欢
    • 2014-06-25
    • 2021-01-25
    • 2021-07-14
    • 2017-08-22
    • 2017-03-25
    • 2016-11-10
    • 2020-01-08
    • 2018-06-27
    • 1970-01-01
    相关资源
    最近更新 更多