为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用 10 公里以下的表单从 Db 获取数据

尝试使用 10 公里以下的表单从 Db 获取数据

PHP
红颜莎娜 2022-08-19 10:27:33
我正在尝试使用形式通过纬度和经度从10公里记录下的数据库获取数据,但我面临着erorr埃罗尔Illuminate\Database\QueryException SQLSTATE[42S22]: 列未找到: 1054 “have clause” 中的未知列 'distance' (SQL: select count(*) 作为距离< 25 的聚合)users网.phpRoute::get('/map','MapController@index');Route::get('/userview','MapController@getUserByLatLong');Route::post('/showdata','Mapcontroller@showdata');User.blade.php<form method="POST" action="{{ action('Mapcontroller@showdata') }}">@csrf<lable>Latitude</lable><input type="text" name="latitude" /><br><lable>Longitude</lable><input type="text" name="longitude" /><br><lable>Kilomneter</lable><input type="text" name="kilometer" /><br><input type="submit" name="submit" /><br></form>控制器代码public function showdata(Request $request)    {        $this->validate($request, [            'latitude' => 'required',            'longitude' => 'required'        ]);        $latitude = $request->input('latitude');        $longitude = $request->input('longitude');        $users = DB::table('users')        ->select(DB::raw($latitude,$longitude, 'SQRT(POW(69.1 * (latitude - 24.900110), 2) + POW(69.1 * (67.099760 -longitude) * COS(latitude / 57.3), 2)) AS distance'))        ->havingRaw('distance < 25')        ->OrderBy('distance')        ->paginate(10)        ->get();        echo $users;        return view('userview',['users' => $users]);    }
查看完整描述

4 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我认为最适合您的解决方案是在用户表中添加列距离,而不是在模型中添加突变体,如下所示:

public function setDistanceAttribute($value){
    return $this->attributes['distance'] = SQRT(POW(69.1 * ($this->['latitude'] - 24.900110), 2) + POW(69.1 * (67.099760 -$this->['longitude']) * COS(latitude / 57.3), 2));
}

然后更新您的查询:

 $users = DB::table('users')
        ->select(DB::raw($latitude,$longitude))
        ->havingRaw('distance < 25')
        ->OrderBy('distance')
        ->paginate(10)
        ->get();

希望它能:)


查看完整回答
反对 回复 2022-08-19
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

将 ->havingRaw('distance < 25') 替换为 have('distance', '<' , 25)



查看完整回答
反对 回复 2022-08-19
?
三国纷争

TA贡献1804条经验 获得超7个赞

解决


public function showdata(Request $request)

{

    $this->validate($request, [

        'latitude' => 'required',

        'longitude' => 'required'

    ]);

    $latitude = $request->input('latitude');

    $longitude = $request->input('longitude');

    $users = DB::table('users')

    ->select(DB::raw('id,name,phone,latitude,longitude, SQRT(POW(69.1 * (latitude - '.$latitude.'), 2) + POW(69.1 * ('.$longitude.'-longitude) * COS(latitude / 57.3), 2)) AS distance'))

    ->havingRaw('distance < 25')

    ->OrderBy('distance')

    ->get();

    return view('userview',['users' => $users]);



}


查看完整回答
反对 回复 2022-08-19
?
慕后森

TA贡献1802条经验 获得超5个赞

用于使用内置方法,如下所示:whereRaw

        $users = DB::table('users')
        ->select('latitude', 'longitude', DB::raw('SQRT(POW(69.1 * (lattitude - 24.900110), 2) + POW(69.1 * (67.099760 -longitude) * COS(latitude / 57.3), 2)) AS distance'))
        ->whereRaw('SQRT(POW(69.1 * (? - 24.900110), 2) + POW(69.1 * (67.099760 -?) * COS(? / 57.3), 2)) < 25', array($latitude, $longitude, $latitude))
        ->orderBy('distance')
        ->paginate(10)
        ->get();


查看完整回答
反对 回复 2022-08-19
  • 4 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信