首页 > 解决方案 > 计算最近位置时出现语法错误

问题描述

enter code here我想它很简单,但我肯定在这里遗漏了一些东西。我在这里想要实现的是使用当前位置计算最近的位置。在不添加计算部分的情况下,查询工作正常。

我收到一条错误消息,提示“语法错误,意外 'AS' (T_AS),期待 ',' 或 ')'”

任何帮助将不胜感激。

enter code here
$testjoin = doctors::where('location_id',$data['location_id'])
                        ->where('medication_id',$data['medication_id'])
                        ->where('specialization_id',$data['specialization_id'])
                        ->where('facility_id',$data['facility_id'])
                        ->where('distance','<=',20)->orderBy('distance','desc')->take('20')
                ->join('locations', 'doctors.location_id', '=', 'locations.id')
                ->join('medication_types', 'doctors.medication_id','=','medication_types.id')
                ->join('specializations', 'doctors.specialization_id','=','specializations.id')
                ->join('facility_types', 'doctors.facility_id','=','facility_types.id')
                ->select(
                    'doctors.id',
                    'doctors.location_id',
                    'doctors.first_name',
                    'doctors.contact',
                    'doctors.email',
                    'doctors.lat',
                    'doctors.lng',
                    'locations.location',
                    'medication_types.medication',
                    'specializations.specialization',
                    'facility_types.type',
                    DB::raw( 6371 * acos( cos( radians(15.538210) ) * cos( radians( lat ) ) * 
                cos( radians( lng ) - radians(73.822974) ) + sin( radians(15.538210) ) * 
                sin( radians( lat ) ) )  AS distance )
                )->get();

标签: phplaravel

解决方案


我认为您不能在选择中进行计算。select() 只选择字段。请尝试更改计算

 ( 6371 * acos( cos( radians(15.538210) ) * cos( radians( lat ) ) * 
       cos( radians( lng ) - radians(73.822974) ) + sin( radians(15.538210) ) * 
       sin( radians( lat ) ) ) ) AS distance 

经过

 DB:raw( 6371 * acos( cos( radians(15.538210) ) * cos( radians( lat ) ) * 
       cos( radians( lng ) - radians(73.822974) ) + sin( radians(15.538210) ) * 
       sin( radians( lat ) ) )  AS distance )

您可以使用 DB:raw 在您选择的字段中准备一个新列。

并且请检查“from”、“have”、“limit”、“orderby”所有这些都可以作为医生模型的方法。例如。

->where('distance','<=',20)->orderBy('distance','desc')->take('20')->get()

请试试这个,让我知道它是如何工作的:)


推荐阅读