Попытка получить свойство не-объекта в laravel с помощью формулы гаверсинуса - PullRequest
0 голосов
/ 10 июля 2020

Я хочу получить расстояние до всех транспортных средств от зарегистрированного пользователя, но когда я применяю свои запросы, он возвращает расстояние до одного транспортного средства, а затем показывает «Попытка получить свойство не-объекта» в этой строке «$ latFrom = deg2rad ($ lat -> lat); "

получить имя пользователя и широту и долготу транспортного средства

  $users_id = Auth::id();
        // return $users_id;
$lon = DB::table('users')
        ->SELECT('lon')
        ->where("id", $users_id)
        ->first();
$lat = DB::table('users')
        ->SELECT('lat')
        ->where("id", $users_id)
        ->first();

$vehicles=DB::table('vehicle')
            ->get();

моя формула гаверсинуса

   function haversineGreatCircleDistance(
  $lat, $lon, $vehicle_lat, $vehicle_lon, $earthRadius = 6371000)
{      

    // return $lon;
  // convert from degrees to radians
  $latFrom = deg2rad($lat->lat);
  $lonFrom = deg2rad($lon->lon);
  $latTo   = deg2rad($vehicle_lat);
  $lonTo   = deg2rad($vehicle_lon);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;
}

после применения гаверсинуса я распечатываю расстояние

foreach ($vehicles as $vehicle) {
                $center_lat = $lat;
                $center_lng = $lon;
                $lat=$vehicle->lat;
                $lng=$vehicle->lon;

                $distance = haversineGreatCircleDistance($center_lat, $center_lng, $lat, $lng, 6371);
print($distance);
}

1 Ответ

0 голосов
/ 10 июля 2020

В вашем коде происходит несколько странных вещей. Трудно точно понять, что не так со строкой $ latFrom, поскольку похоже, что $ lat должен быть объектом, просто смотрящим на ваш код. Я предполагаю, что он возвращает null или устанавливается в null до того, как дойдет до функции расстояния.

Вы можете проверить это, выполнив dd($lat) и посмотрев, что на самом деле возвращается из контроллера. Значение будет тупым прямо на экране. Вы можете выгрузить журнал запросов, чтобы увидеть, какой запрос на самом деле выполняется, а также для дальнейшего устранения неполадок.

Пример варианта сброса запроса в Laravel 7

Но в этом случае я бы просто немного реорганизовал, так как вам вообще не нужно выполнять вызов базы данных для $ lon и $ lat. Это все тот же пользователь, и laravel в любом случае уже заполняет для вас пользователя auth, который можно получить с помощью команды Auth :: user (). $user = Auth::user();

Тогда $ user-> lat и $ user-> lon будут иметь широту и долготу из базы данных.

В качестве альтернативы вы можете использовать Auth::user()->lat и Auth::user()->lon без сохранения ее сначала в отдельной пользовательской переменной.

В вашем автомобиле l oop:

foreach ($vehicles as $vehicle) {
    $distance = havesineGreatCircleDistance($user->lat, $user->lon, $vehicle->lat, $vehicle->lon);
}

Примечание. Я не стал устанавливать переменную перед тем, как поместить ее в функцию. поскольку от этого ничего не выиграет, если только вы по какой-то причине не хотите ссылаться на них с этими именами после этой точки.

Затем в функции

$latFrom = deg2rad($lat);
$lonFrom = deg2rad($lon);

Обратите внимание на разницу здесь с просто выполняю $ lat вместо $ lat-> lat. При использовании этого метода они не будут объектами, а просто значениями, поэтому вы не захотите ссылаться на них как на объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...