我正在尝试添加在Model :: get()方法中计算的距离。距离应标记为“距离”,而现在它不返回任何内容(没有添加选择)。
这是我的Eloquent查询: `
Candidate::whereHas('positions', function($query) use ($data) {
$query->where('positions.id', $data['position']);
})
->whereHas('user', function($query) use ($data) {
$query->where('status', '=', 1);
if($data['lat'] !== null and $data['lng'] !== null){
$query->whereHas('address', function($query) use ($data) {
$sqlDistance = DB::raw('( 111.045 * acos( cos( radians(' . $data['lat'] . ') ) * cos( radians( addresses.latitude ) )
* cos( radians( addresses.longitude ) - radians(' . $data['lng'] . ') )
+ sin( radians(' . $data['lat'] . ') ) * sin( radians( addresses.latitude ) ) ) )');
$query->selectRaw("{$sqlDistance} AS distance");
});
}
})->with('user.address','user','user.media')
->get();
`
这是我得到的:
任何帮助将不胜感激。感谢
答案 0 :(得分:1)
我正在尝试查找距用户当前位置的营业距离。
$request->latitude
和$request->longitude
是将在请求中传递的用户的当前位置,我已经将业务位置存储在名为latitude
和longitude
的数据库列中。 selectSub()
用于在数据记录中添加列。它将包含两个参数,第一个是函数或列名,第二个是新列名。
Business::with(['user','category'])
->select('*')
->selectSub('(111.111 *
DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latitude))
* COS(RADIANS('.$request->latitude.'))
* COS(RADIANS(longitude - '.$request->longitude.'))
+ SIN(RADIANS(latitude))
* SIN(RADIANS('.$request->latitude.'))))))','distance_in_km')
->orderBy('distance_in_km','ASC')
->take($limit)
->skip($offset)->get();
这是我在laravel中工作的代码
答案 1 :(得分:0)
解决方案是Eloquent和Query Builder之间的混合:
`
Candidate::select('candidates.*')
->whereHas('positions', function ($query) use ($data) {
$query->where('positions.id', $data['position']);
})
->whereHas('user', function ($query) use ($data) {
$query->where('status', '=', 1);
$query->whereHas('address', function ($query) use ($data) {
if($data['country'] !== null){
$query->where('country', '=', $data['country']);
}
});
})
->leftJoin('users', 'users.id', 'candidates.user_id')
->with('user.address', 'user', 'user.media','reviews')
->leftJoin('addresses', 'addresses.id', 'users.address_id')
->addSelect(DB::raw("{$sqlDistance} AS distance") )
->get();
`