使用 laravel scout 时,searchable() 不会更新相关模型

when using laravel scout, searchable() isn't updating related models

我在使用 scout elastic search 更新相关模型时遇到问题。

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

在我的数据库中,我看到事件和价格范围表更新了。但是,当我查看我的弹性搜索数据时,只有事件数据已更新。任何相关模型都没有更新。

如果我对模型和价格范围模型进行第二次更新,那么弹性搜索数据会显示我第一次更新时的数据(相关模型总是落后一次更新) 我试过

$event->pricerange->searchable()

但给我一个错误,因为我没有价格范围的可搜索索引,我只是在使用我的事件模型及其与索引的关系。除了 searchable() 之外,还有其他方法可以强制更新吗?

看起来你们的关系正在 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();

但是请注意,每次更新时,都会调用 searchable 方法,因此每次更新都会对其进行两次索引。

因此,您也可以更新 Event 模型中的 toSearchableArray() 方法,以便在返回数据之前获得新模型(我假设您使用的是 babenkoivan/scout-elasticsearch-driver) .