Как я могу сохранить объект ParseGeoPoint в mongodb (используя mLab)

Я хочу сохранить адрес (реляционный объект) с географическими точками, чтобы впоследствии получить все события, которые имеют адрес рядом с указанным местоположением, все будет основано на координатах. Используя следующий кусок кода -

$address = new ParseObject("Address");
$point = new ParseGeoPoint(23.80, -120.90);
$address->set("location", $point);
$address->save();

Тип местоположения в моей базе данных является геопунктом, но он дает мне постоянную ошибку.

Внутренняя ошибка сервера. Код ошибки: исключение "Исключение" с сообщением "Невозможно сериализовать несохраненный Parse.Object"

Опубликовать это я попробовал следующий код -

$address = new ParseObject("Address");
$address->save();
$point = new ParseGeoPoint(23.80, -120.90);
$address->set("location", $point);
$address->save();

Я попытался это сделать, чтобы удалить вышеуказанную ошибку несохраненного объекта Parse.Object, но в итоге он сохранил только мой адресный объект и никогда не сохранял местоположение в нем. Как мне этого добиться?

Полный вид кода -

function saveEvent() {
   $title = $this->input->post('title');
   $eventCode = $this->input->post('eventCode');
   $event = new ParseObject("Event");
   $event->set("title", $title);
   $event->set("eventCode", $eventCode);
   $address = $this->saveAddressObject($event, $url);
   $event_address_Relation = $event->getRelation("address");
   if (!empty($address)) {
            $event_address_Relation->add($address);
   }
   $event->save();
  }
function saveAddressObject($event, $url) {
    $fullAddress = $this->input->post('fullAddress');
    $address1 = $this->input->post('address1');
    $address2 = $this->input->post('address2');
    $city = $this->input->post('city');
    $state = $this->input->post('state');
    $zipCode = (int) $this->input->post('zipCode');
    $country = $this->input->post('country');
    $latitude = $this->input->post('latitude');
    $longitude = $this->input->post('longitude');
    try {
            $address = new ParseObject("Address");
            $address->set("fullAddress", $fullAddress);
            $address->set("address1", $address1);
            $address->set("address2", $address2);
            $address->set("city", $city);
            $address->set("state", $state);
            $address->set("zipCode", $zipCode);
            $address->set("country", $country);
            $address->set("latitude", $latitude);
            $address->set("longitude", $longitude);
            $point = new ParseGeoPoint($latitude, $longitude);
            $address->set("location", $point);
            $address->save();
           return $address;
    } catch (ParseException $error) {
        print_r($error);
    } catch (Exception $ex1) {
        print_r($ex1);
    }
}

1 ответ

Для вашего второго примера, только один экземпляр объекта может быть сохранен за один раз, а второй + пытается, пока идет другая попытка, молча завершается неудачей. По крайней мере, на iOS. Я полагаю, что это похоже здесь.

Это ваш точный код? Первая упомянутая вами ошибка имеет место, когда вы пытаетесь присоединить новый объект, который еще не был сохранен к другому объекту, и вы упомянули, что эти адреса используются реляционно. Я держу пари, что вы пытаетесь прикрепить объект к другому как указатель, и не сохранили объект, а это значит, что у него еще нет идентификатора, поэтому вы не можете создать указатель на него.

Изменить - я не уверен, какой SDK вы используете, но вызовы сохранения являются асинхронными, то есть это происходит не сразу, поэтому, возможно, вы думаете, что сначала сохраняете объект, но на самом деле сохранение еще не закончено, а вы потом пытаетесь прикрепить его к другому объекту? Это также может быть связано с тем, почему ваш второй пример не работает, так как у вас нет обработчика завершения, который возвращается после второго сохранения. Возможно, первый умудряется закончить, но второй никогда не завершает, пока ваша функция не вернется.

Другие вопросы по тегам