我有点迷茫,我正在尝试计算最接近登录用户的距离和排序任务。问题是我的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
}
但这会带来非常难看的反应并且难以使用。由于Mission
与Building
有关系,我想将该表加载到响应中(而不是显示building_id )。但是使用DB:Table()
,这是不可能的(?)
{
"id": 5,
"building_id": 2
"building" : {
"id": 2
...
"lat": 33,
"lng": 55
}
...
}
这是我想要的响应,并按lat / lng排序。 有没有办法用Eloquents模型做到这一点?
答案 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。