Laravel - 在给定用户的经度和纬度时检索距离时,我在所有模型上都得到相同的结果。为什么?
Laravel - When retrieving the distance when given a user's longitude & latitude, I keep getting the same result on all models. Why?
我的数据库中有一个 JSON 列存储经度和纬度坐标,设置为:
_geoloc:{lat: 33.6556324, lng: -117.7015161}.
我正在尝试使用用户的经纬度坐标查询数据库,以检索特定距离内的所有记录。下面是我正在使用的函数,但是所有结果都返回与每个模型相同的距离 7797.5012454514。我想将 $distance
参数作为英里传递。
protected function get_locations( $latitude, $longitude, $distance = 8000 ) {
$results= my_table::select( 'my_table.*' )
->selectRaw( '(3959 * (acos( cos( radians(?) )
* cos( radians( "_geoloc->lat" ) )
* cos( radians( "_geoloc->lng" ) - radians(?))
+ sin( radians( ? ) )
* sin( radians( "_geoloc->lat" ) ) ) ) )
AS distance', [ $latitude, $longitude, $latitude ] )
->havingRaw( "distance< ?", [ $distance ] )
->groupBy( 'first_name' )
->get();
return $results;
}
以防其他人遇到同样的问题。该解决方案需要在查询中使用 JSON_EXTRACT 以及 $ 符号来标记对象。
protected function get_locations( $latitude, $longitude, $distance = 20 ) {
$results = ( new my_table)->having( 'distance', '<', $distance )
->select( DB::raw( "*,
(3959 * ACOS(COS(RADIANS($latitude))
* COS(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat')))
* COS(RADIANS($longitude) - RADIANS(JSON_EXTRACT(`_geoloc`,'$.lng')))
+ SIN(RADIANS($latitude))
* SIN(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))))) AS distance" )
)->orderBy( 'distance', 'asc' )
->get();
return $results
}
我的数据库中有一个 JSON 列存储经度和纬度坐标,设置为:
_geoloc:{lat: 33.6556324, lng: -117.7015161}.
我正在尝试使用用户的经纬度坐标查询数据库,以检索特定距离内的所有记录。下面是我正在使用的函数,但是所有结果都返回与每个模型相同的距离 7797.5012454514。我想将 $distance
参数作为英里传递。
protected function get_locations( $latitude, $longitude, $distance = 8000 ) {
$results= my_table::select( 'my_table.*' )
->selectRaw( '(3959 * (acos( cos( radians(?) )
* cos( radians( "_geoloc->lat" ) )
* cos( radians( "_geoloc->lng" ) - radians(?))
+ sin( radians( ? ) )
* sin( radians( "_geoloc->lat" ) ) ) ) )
AS distance', [ $latitude, $longitude, $latitude ] )
->havingRaw( "distance< ?", [ $distance ] )
->groupBy( 'first_name' )
->get();
return $results;
}
以防其他人遇到同样的问题。该解决方案需要在查询中使用 JSON_EXTRACT 以及 $ 符号来标记对象。
protected function get_locations( $latitude, $longitude, $distance = 20 ) {
$results = ( new my_table)->having( 'distance', '<', $distance )
->select( DB::raw( "*,
(3959 * ACOS(COS(RADIANS($latitude))
* COS(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat')))
* COS(RADIANS($longitude) - RADIANS(JSON_EXTRACT(`_geoloc`,'$.lng')))
+ SIN(RADIANS($latitude))
* SIN(RADIANS(JSON_EXTRACT(`_geoloc`,'$.lat'))))) AS distance" )
)->orderBy( 'distance', 'asc' )
->get();
return $results
}