使用 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
) .
我在使用 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
) .