2016-03-07 148 views
1

我有點失落,我試圖計算距離和排序任務最接近登錄的用戶。問題在於我的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 
    } 
    ... 
} 

這是我想獲得,並通過緯度/經度排序的響應。 是否有任何可能的方式與Eloquents模型做到這一點?

回答

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:不要忘記設置relationBuilding模型,除非with方法將失敗。

+0

啊是的,謝謝你。它確實有用! 但不得不改變命令壽'Mission :: select(...)'謝謝! – mertje