Ошибка геолокации при попытке сохранить новую запись - PullRequest
0 голосов
/ 30 января 2019

Я использую Алголию с Laravel для своего поиска.Это работает нормально, но когда я добавил геолокации, я столкнулся с проблемой.У меня есть поля в БД для lat и lng, поэтому я добавил это в модель:

public function toSearchableArray()
    {
        $record = $this->toArray();

        $record['_geoloc'] = [
            'lat' => $record['latitude'],
            'lng' => $record['longitude'],
        ];

        unset($record['created_at'], $record['updated_at']); // Remove unrelevant data
        unset($record['latitude'], $record['longitude']);

        return $record;
    }

Однако, когда я попытался сохранить модель, я получил эту ошибку:

Атрибуты _geoloc.lat или _geoloc.lng не могут быть нулевыми рядом со строкой: 1> столбец: 526

Итак, я добавил поле _geoloc в БД, которое было ТЕКСТОМ.Но теперь я получаю эту ошибку при попытке сохранить мою модель:

Атрибут AlgoliaSearch \ AlgoliaException (400) _geoloc не может содержать строку рядом со строкой: 1 столбец: 606

Из сообщения об ошибке:

$ answer = Json :: decode ($ response, true);

   if (intval($http_status / 100) == 4) {
       throw new AlgoliaException(isset($answer['message']) ?     > $answer['message'] : $http_status.' error', $http_status);

Вот сохранение модели:

        //gets an array of lat and lng
        //$gps is an assoc array
        //logger($geoJson) yields {"lat":34.8802845,"lng":-77.1041536}
        $gps = Map::getListingDetails($request);
        $geoJson = json_encode($gps);

        $listing = Listing::create([
                'user_id' => auth()->id(),
                '_geoloc' => $gps,               
         ]);

Я делаю что-то не так с самого начала или в конце?С toSearchAbleArray, разве код Алголии не сможет декодировать строку json, сохраненную в БД?Заранее спасибо!

1 Ответ

0 голосов
/ 05 июня 2019

Использование

toSearchableArray

- это способ записи, но ключи ассоциативного массива в модели / контроллере не совпадают.В контроллере вы используете "lat" и "lng", но в модели вы используете "широту" и "долготу".

В вашей модели измените:

'lat' => $record['latitude'],
'lng' => $record['longitude'],

на:

'lat' => $record['lat'],
'lat' => $record['lng'],

Вы не сможете хранить ассоциативный массив в MySQL.Я предлагаю изменить:

$gps = Map::getListingDetails($request);

на

$input = Map::getListingDetails($request)
$gps = serialize($input);
...