при использовании laravel scout searchable() не обновляет связанные модели

У меня возникла проблема с обновлением связанных моделей с помощью поискового эластичного поиска.

$event->priceranges()->delete();
$event->priceranges()->Create([
       'price' => $ticket['ticket_price']
]);
$event->update([ 
      'show_times' => $request->showtimes,
]);
$event->searchable();

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

Если я сделаю второе обновление модели и модели ценового диапазона, то эластичные данные поиска отобразят мои данные из первого сделанного мной обновления (это всегда одно обновление для связанных моделей), которые я пытался сделать

$event->pricerange->searchable()

но дает мне ошибку, потому что у меня нет доступного для поиска индекса для ценового диапазона, я просто использую свою модель событий и ее отношение к индексу. Есть ли способ принудительно обновить обновление, кроме searchable()?


person Chris Grim    schedule 02.05.2020    source источник


Ответы (1)


Похоже, ваши отношения индексируются в модельном индексе Event, верно?

Вероятно, он не обновляется, потому что отношения уже загружены, а Laravel не обновляет уже загруженные данные отношений, например:

$event = Event::with('priceranges')->first()
var_dump($event->priceranges->count()): // outputs for example 5

$event->priceranges()->create([...]);
var_dump($event->priceranges->count()): // still outputs 5, meaning that the created pricerange is not loaded

Итак, чтобы исправить эту проблему, вы можете перезагрузить модель перед вызовом searchable():

$event = $event->fresh();
$event->searchable();

Но обратите внимание, что при каждом обновлении метод поиска уже вызывается, поэтому вы будете индексировать его два раза при каждом обновлении.

Итак, в качестве альтернативы вы можете обновить свой метод toSearchableArray() в модели Event, чтобы получить новую модель перед возвратом данных (я предполагаю, что вы используете babenkoivan/scout-elasticsearch-driver).

person Elias Soares    schedule 03.05.2020
comment
Боже, это был такой удивительный ответ. Спасибо, что нашли время, чтобы объяснить это. Ваше решение сработало, и я также рассмотрю вариант toSearchableArray. (Я использую бабенковианский плагин) - person Chris Grim; 03.05.2020