基于lng和lat

时间:2017-02-01 22:34:05

标签: php mysql laravel haversine

开发时遇到了问题。

我实现了这个范围功能,我在模型上运行

listing :: nearest($ lat,$ lng) - > paginate(5);

public function scopeClosest($query, $lat, $lng, $distance = 0, $units = 'km')
{

    switch ( $units ) {
        case 'miles':
            //radius of the great circle in miles
            $gr_circle_radius = 3959;
        break;
        case 'km':
            //radius of the great circle in kilometers
            $gr_circle_radius = 6371;
        break;
    }

    return $query->selectRaw(
        '*, ( '.$gr_circle_radius.' * acos( cos( radians('.$lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('.$lng.') ) + sin( radians('.$lat.') ) * sin( radians( lat ) ) ) ) AS distance'
    )->havingRaw("distance < ?", [10] );

}

但是我遇到了这个错误,我现在不知道如何修复

  

SQLSTATE [42S22]:未找到列:1054未知列&#39;距离&#39;在&#39;有条款&#39; (SQL:选择count(*)作为距离<10)的listings的聚合

似乎laravel正在运行2个查询,如果我不使用havingRaw()

,这就是它的样子
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
  ]
]

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

1 个答案:

答案 0 :(得分:1)

这就是我在我的案例中所做的..我需要查询半径为5公里的距离。我使用whereRawpaginate

$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);

如果你想在里程中简单地乘以69.041236而不是111.111