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; }