public static function haversine($query, $lat, $lng, $max_distance = 20, $units = 'kilometers', $fields = false)
 {
     if (empty($lat)) {
         $lat = 0;
     }
     if (empty($lng)) {
         $lng = 0;
     }
     /*
      *  Allow for changing of units of measurement
      */
     switch ($units) {
         case 'miles':
             //radius of the great circle in miles
             $gr_circle_radius = 3959;
             break;
         case 'kilometers':
             //radius of the great circle in kilometers
             $gr_circle_radius = 6371;
             break;
     }
     /*
      *  Support the selection of certain fields
      */
     if (!$fields) {
         $fields = array('users.*', 'users_profile.*', 'users.username as user_name');
     }
     /*
      *  Generate the select field for disctance
      */
     $distance_select = sprintf("\n                                    ROUND(( %d * acos( cos( radians(%s) ) " . " * cos( radians( lat ) ) " . " * cos( radians( lng ) - radians(%s) ) " . " + sin( radians(%s) ) * sin( radians( lat ) ) " . " ) " . ")\n                                    , 2 ) " . "AS distance\n                                    ", $gr_circle_radius, $lat, $lng, $lat);
     $data = $query->select(DB::raw(implode(',', $fields) . ',' . $distance_select))->having('distance', '<=', $max_distance)->orderBy('distance', 'ASC')->get();
     //echo '<pre>';
     //echo $query->toSQL();
     //echo $distance_select;
     //echo '</pre>';
     //die();
     //
     //$queries = DB::getQueryLog();
     //$last_query = end($queries);
     //var_dump($last_query);
     //die();
     return $data;
 }