with('markets')->whereIn('id',$cityIds)->get(); foreach ($res as &$v){ foreach ($v->markets as &$m) { $m->Distance = $this->getDistance($m->lng,$m->lat,108.370333,22.813527); } } return $res; } public function searchMarket($keywords,$cityId = 2163) { $res = Market::query()->where([ ['name','like','%'.$keywords.'%'], ['city_id','=',$cityId] ]) ->get(); foreach ($res as &$v){ $v->Distance = $this->getDistance($v->lng,$v->lat,108.370333,22.813527); } return $res; } function getDistance($lng1, $lat1, $lng2, $lat2, $unit = 2, $decimal = 2) { $EARTH_RADIUS = 6370.996; // 地球半径系数 $PI = 3.1415926535898; $radLat1 = $lat1 * $PI / 180.0; $radLat2 = $lat2 * $PI / 180.0; $radLng1 = $lng1 * $PI / 180.0; $radLng2 = $lng2 * $PI / 180.0; $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))); $distance = $distance * $EARTH_RADIUS * 1000; if ($unit === 2) { $distance /= 1000; } return round($distance, $decimal); } }