Laravel Scout:只有在特定字段发生变化时才会更新



当我关心的数据发生变化时,我试图通过只更新Algolia记录(从而节省数千次不必要的操作(来优化我的应用程序。

我有一个表格,里面有各种产品的价格信息,当价格变化时,每分钟都会更新。目前,Algolia的可搜索模型与预期保持同步,但这是不必要的,因为我网站上的搜索功能只提供产品本身的搜索,而不是价格。

目前,Scout每次在模型上调用update()方法时都会在Algolia中执行一次操作(在每个模型上每分钟执行一次(。

有没有一种方法可以让我有条件地触发Algolia只在制造商、产品或型号变体发生变化而不是价格发生变化时进行更新

我的模型上的toSearchableArray()函数目前看起来是这样的,如果这有帮助的话:

public function toSearchableArray() {
return [
'id'                    => $this->id,
'manufacturer'          => $this->manufacturer,
'product'               => $this->product,
'variant'               => $this->variant,
];
}

您想要的是withoutSyncingToSearch方法吗?

这意味着,无论你目前在哪里更新价格,都要用这种方法包装。

虽然您的问题中没有提供此代码,但我假设大致如下:

AppModel::withoutSyncingToSearch ( function() use ($item, $newPrice) {
$item->price = $newPrice;
$item->save();
});

能为你工作吗?

为您的模型添加以下函数:

public function searchIndexShouldBeUpdated()
{
if (empty(array_intersect_key( $this->getChanges(),$this->toSearchableArray() )))
{
return false;
} else {
return true;
}
}

它将检查上次更新是否更改了可搜索数组中的任何属性,并且只有在进行了此类更新时才会更新搜索索引。

最新更新