2016-09-30 4 views
0

У меня возникли трудности с отправкой массива, который нужно индексировать в Algolia, потому что я должен его закодировать, чтобы сначала сохранить его в базе данных.Отправка массива для индексации с помощью системы поиска Larvel Algolia

$algoliaAgent = AlgoliaAgent::firstOrCreate([ 
    'FirstName' => $item->FirstName, 
    'LastName' => $item->LastName, 
    'AgentRecId' => $item->AgentRecId, 
    'Style' => json_encode(explode(',', $item->Style)) 
]); 

$algoliaAgent->pushToIndex(); 

В результате индекс в Algolia выглядит следующим образом:

"[\"value1\",\"value2\",\"value3\"]" 

Есть ли способ, чтобы декодировать значение перед его отправкой в ​​Algolia?

+0

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

ответ

0

Я считаю, что вы ищете методы json_encode и json_decode.

Также см. Laravel Scout documenation для получения дополнительной информации о том, что проиндексировано.

По умолчанию вся форма toArray данной модели будет сохранена в своем индексе поиска. Если вы хотите, чтобы настроить данные, которые синхронизируются с индексом поиска, вы можете переопределить метод toSearchableArray на модели:

+0

Спасибо Эрик, но я все еще в 5.2. Но ваш ответ заставил меня подумать об изменении метода pushToIndex в исходном коде. –

+0

О, хорошо, в чем проблема, с которой вы столкнулись? Являются ли дополнительные escape-символы проблемой, о которой вы говорите? Или потому, что это не ассоциативный массив? –

+0

Это была ошибка, которую я получал, если я не кодировал: ErrorException preg_replace(): Параметр mismatch, pattern - это строка, а замена - массив. Нет, это не ассоциативный массив. –

0

Окончательное решение было изменить метод pushToIndex(), чтобы перехватывать цикл, который посылает объект для Алголии.

Что-то вроде этого: общественная функция pushToIndex() { /** @var \ AlgoliaSearch \ Laravel \ ModelHelper $ modelHelper */ $ modelHelper = App :: сделать ('\ AlgoliaSearch \ Laravel \ ModelHelper') ;

$indices = $modelHelper->getIndices($this); 

    /** @var \AlgoliaSearch\Index $index */ 
    foreach ($indices as $index) { 

     if ($modelHelper->indexOnly($this, $index->indexName)) { 

      $temp = $this->getAlgoliaRecordDefault($index->indexName); 

      $temp['Style'] = $this->castArray($temp['Style']); 

      //$index->addObject($this->getAlgoliaRecordDefault($index->indexName)); 
      $index->addObject($temp); 

     } 
    } 
} 

public function castArray($raw) { 
    $arrayString = ''; 
    if(is_string($raw)) { 
     $arrayString = explode(",",$raw); 
    } 
    return $arrayString; 
} 
Смежные вопросы