2016-03-07 6 views
1

Я как бы потерян, я пытаюсь подсчитать расстояние и выполнить миссию, ближайшую к зарегистрированному пользователю. Проблема в том, что мои lat и lng находятся в другой таблице (Buildings), которая определяется как отношение в Mission. Я использую QueryBuilder Laravel/Lumen для получения записей из базы данных.Eloquent sort by relationship column

$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 
} 

Но это возвращает довольно уродливый ответ и трудно работать. Поскольку Mission имеют отношение с Building, я хотел бы также загрузить эту таблицу в ответ (Вместо отображения building_id). Но с DB:Table() это не возможно (?)

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

Это ответ, который я хотел бы получить, и быть отсортированы по LAT/LNG. Есть ли какой-либо возможный способ сделать это с помощью моделей 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: Не забудьте установить relation в вашей Building модели, если метод with не удастся.

+0

Ах да, спасибо. Это сработало! Но пришлось изменить порядок tho на 'Mission :: select (...)' Спасибо! – mertje