Php 在Laravel应用程序中按纬度和经度查找关系计数
我正在尝试在Laravel上构建一个应用程序。我有一个模型Php 在Laravel应用程序中按纬度和经度查找关系计数,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我正在尝试在Laravel上构建一个应用程序。我有一个模型项目,它有id,名称,州id,城市id,纬度,经度,状态,以及时间戳 我尝试添加一个附近的特性,该特性根据纬度和经度约束查找项目。我的问题是: $projects = Project::where('projects.status', 'saved') ->selectRaw("*, ( 6371 * acos( cos( radians(?) ) * cos( radians( latit
项目
,它有id
,名称
,州id
,城市id
,纬度
,经度
,状态
,以及时间戳
我尝试添加一个附近的特性,该特性根据纬度和经度约束查找项目。我的问题是:
$projects = Project::where('projects.status', 'saved')
->selectRaw("*,
( 6371 * acos( cos( radians(?) ) *
cos( radians( latitude ) )
* cos( radians( longitude ) - radians(?)
) + sin( radians(?) ) *
sin( radians( latitude ) ) )
) AS distance", [request('latitude'), request('longitude'), request('latitude')])->having("distance", "<", request('range')
->with('state', 'city')
->orderBy('projects.updated_at', 'desc')
->paginate(50)
$projects=Project::where('projects.status','saved')
->选择原始(“*”,
(6371*acos(cos(弧度(?)*
cos(弧度(纬度))
*cos(弧度(经度)-弧度(?)
)+sin(弧度(?)*
sin(弧度(纬度)))
)作为距离“,[request('latitude')、request('latitude')、request('latitude'))->having('distance“,”问题可能是在having()
调用中将数据库和表名作为前缀
由于distance
是在selectRaw
中创建的别名,因此您需要使用havingRaw()
->havingRaw('distance<?',request('range'))
$lat=$request->latitude;
$lng=$request->longitude???”;
$distance=$request->range???”;
$states=State::query();
$states=$states::withCount(['projects'=>函数($q)use($lat,$lng,$distance){
$haversineSQL=“(6371*acos(弧度('{$lat}'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('{$lng}'))+sin(弧度('{$lat}')))*sin(弧度(纬度))”;
$states=$states->whereRaw($haversineSQL.<?',$distance);
}])->orderBy('name','desc')->paginate(2);
或
$states = State::withCount(['projects' => function ($query) use ($lat,$lng,$distance){
$query->select(\DB::raw('*,( COALESCE( 6371 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $lng . ') ) + sin( radians(' . $lat . ') ) * sin( radians( latitude ) ) ) ) ) AS distance'))->having('distance', '<', $distance );
}])->orderBy('name', 'desc')->paginate(2);
$states=State::withCount(['projects'=>函数($query)use($lat,$lng,$distance){
$query->select(\DB::raw('*,(合并(6371*acos(弧度('.$lat'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('.$lng'))+sin(弧度('.$lat'))*sin(弧度(纬度))->(“距离”,我会认为任何有效的方法都是“更好的”。如果是我,我会从sql开始。尝试过havingRaw..但得到相同的错误。。
$lat = $request->latitude ?? '';
$lng = $request->longitude ?? '';
$distance = $request->range ?? '';
$states = State::query();
$states = $states::withCount(['projects' => function ($q) use ($lat,$lng,$distance){
$haversineSQL = "( 6371 * acos( cos( radians('{$lat}') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('{$lng}') ) + sin( radians('{$lat}') ) * sin( radians( latitude ) ) ) )";
$states = $states->whereRaw($haversineSQL . '< ?', $distance);
}])->orderBy('name', 'desc')->paginate(2);
$states = State::withCount(['projects' => function ($query) use ($lat,$lng,$distance){
$query->select(\DB::raw('*,( COALESCE( 6371 * acos( cos( radians(' . $lat . ') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(' . $lng . ') ) + sin( radians(' . $lat . ') ) * sin( radians( latitude ) ) ) ) ) AS distance'))->having('distance', '<', $distance );
}])->orderBy('name', 'desc')->paginate(2);