#php #distance
#php #расстояние
Вопрос:
- Возможно ли, что я получаю как данные пользователя, так и расстояние вместе с данными пользователей
- Мне нужны все данные пользователей, которые я получаю в переменной $data вместе с $distance
- обе переменные должны быть в ответе.
public function getProfessionalByCityLatLon(Request $request) { $data = DB::table('profiles') ->leftJoin('cities','profiles.city','=','cities.id') ->leftJoin('users', 'profiles.user_id', '=', 'users.id') ->where('cities.name', '=', $request->select_city) ->get(); foreach($data as $data1){ $longitude1 = 23.6676092; // i will get it later from $request $latitude1 = 86.0490814; // Same with this also $longitude2 = $data1->longitude; $latitude2 = $data1->latitude; $unit = 'kilometers'; $theta = $longitude1 - $longitude2; $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); $distance = acos($distance); $distance = rad2deg($distance); $distance = $distance * 60 * 1.1515; switch($unit) { case 'miles': break; case 'kilometers' : $distance = $distance * 1.609344; $distance = $distance * 1000; } $profDistance = (round($distance, 2)); } $response = [ 'success' => true, 'distance' => $profDistance, 'user' => $data, 'message' => 'City retrieved successfully.', ]; Log::info($response); return response()->json($response, 200); }
Комментарии:
1. Для меня это не имеет особого смысла. Что должно быть
$profDistance
, когда в БД больше одной записи?2. $profDistance — это вычисленное расстояние. Мы получаем две переменные (координаты из запроса) и две из базы данных. и после вычисления расстояния между ними я хочу, чтобы результат был в одном ответе вместе с остальной информацией пользователя.
3. Значит, в БД есть только одна запись, которая соответствует? Тогда вам вообще не нужен
foreach
цикл. Прав ли я, предполагая, что это Laravel / Eloquent? Просто используйтеfirst()
вместоget()
запроса. Вы получите обратно одну запись, которую затем сможете использовать для заполнения остальных данных.4. Спасибо @BenHillier, я нашел решение, на самом деле, сначала я хотел получить все записи из БД, где название города и категория соответствуют параметрам, затем я хочу рассчитать расстояние для каждой записи, поступающей из БД.
Ответ №1:
Я нашел решение, на самом деле, сначала я хотел получить все записи из БД, где название города и категория соответствуют параметрам, затем я хочу рассчитать расстояние для каждой записи, поступающей из БД.
public function getProfessionalByCity($id, $currentLat, $currentLon)
{
Log::info('ye city select karne k baad on load calling ');
// Log::info($id);
$cityname = ucfirst($id);
$newUser = DB::table('profiles')
->leftJoin('cities','profiles.city','=','cities.id')
->leftJoin('users', 'profiles.user_id', '=', 'users.id')
->where('cities.name', '=', $cityname)
->get();
// Log::info($newUser);
$longitude1 = $currentLat;
$latitude1 = $currentLon;
foreach($newUser as $user)
{
$professionalAvatar = $user->avatar;
$profileId = $user->id;
$ProfessionalAvailable = $user->availability;
$ProfessionalName = $user->full_name;
$professionalProfession = $user->profession;
$latitude2 = $user->latitude;
$longitude2 = $user->longitude;
$unit = 'kilometers';
$theta = $longitude1 - $longitude2;
$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
switch($unit) {
case 'miles':
break;
case 'kilometers' :
$distance = $distance * 1.609344;
// $distance = $distance * 1000;
}
$profId[] = $profileId ;
$calculatedDistance[] = (round($distance, 2));
$professName[] = $ProfessionalName;
$profession[] = $professionalProfession;
$availablity[] = $ProfessionalAvailable;
$avatar[] = $professionalAvatar;
// Log::info($calculatedDistance."ye h distance");
// return (round($distance,2));
}
for($count = 0; $count < count($calculatedDistance); $count )
{
$data = array(
'Distance' => $calculatedDistance[$count],
'ProfessionalName' => $professName[$count],
'Profession' => $profession[$count],
'ID' => $profId[$count],
'Availablity' => $availablity[$count],
'Avatar' => $avatar[$count],
);
$calDistance[] =$data;
}
$response = [
'success' => true,
'data' => $calDistance,
'message' => 'City retrieved successfully.',
];
// Log::info($response);
return response()->json($response, 200);
}