Php 基于lng和lat实现haversine距离查询

Php 基于lng和lat实现haversine距离查询,php,mysql,laravel,haversine,Php,Mysql,Laravel,Haversine,我在开发这个时遇到了一个问题 我实现了这个在模型上运行的作用域函数,如 清单:最近($lat,$lng)->分页(5) 当我使用havingRaw时,laravel似乎将其应用于第一个查询,当然它将失败。但是为什么它要将它应用于第一个查询而不是第二个查询呢?我就是这样做的。。我需要查询半径为5公里的距离。我使用了whereRaw和paginate $vtl = VehicleTrackerLog::whereRaw("( 1

我在开发这个时遇到了一个问题

我实现了这个在模型上运行的作用域函数,如

清单:最近($lat,$lng)->分页(5)


当我使用havingRaw时,laravel似乎将其应用于第一个查询,当然它将失败。但是为什么它要将它应用于第一个查询而不是第二个查询呢?

我就是这样做的。。我需要查询半径为5公里的距离。我使用了
whereRaw
paginate

$vtl = VehicleTrackerLog::whereRaw("(
                                    111.1111 
                                    *DEGREES(ACOS(COS(RADIANS('-33.873415'))
                                    * COS(RADIANS(lat))
                                    * COS(RADIANS('151.227538' - lng))+ SIN (RADIANS('-33.873415'))         
                                    * SIN(RADIANS(lat))))<=5)"
                                    )->paginate(5);
$vtl=VehicleTrackerLog::whereRaw(“(
111.1111
*度(ACOS(弧度('-33.873415'))
*COS(弧度(纬度))
*COS(弧度('151.227538'-lng))+SIN(弧度('-33.873415'))

*SIN(弧度(lat)))你的要求是什么,你能解释一下吗?你想根据给定的纬度和经度得到最近的5个位置吗?5只是一个例子,我需要这个分页。如果是我,我只需要运行查询,让用户决定结果是否应该以公里、英里、联盟、链或其他形式显示-在JavaScripty中我没有尝试过这个方法et但它看起来很棒,以英里为单位,我用什么来代替111.1111?对于英里,用公里除以1.609344so“
array:2 [▼
  0 => array:3 [▼
    "query" => "select count(*) as aggregate from `listings`"
    "bindings" => []
    "time" => 0.48
  ]
  1 => array:3 [▼
    "query" => "select *, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance from `listings` limit 5 offset 0"
    "bindings" => []
    "time" => 0.97
  ]
]
$vtl = VehicleTrackerLog::whereRaw("(
                                    111.1111 
                                    *DEGREES(ACOS(COS(RADIANS('-33.873415'))
                                    * COS(RADIANS(lat))
                                    * COS(RADIANS('151.227538' - lng))+ SIN (RADIANS('-33.873415'))         
                                    * SIN(RADIANS(lat))))<=5)"
                                    )->paginate(5);