Laravel Scout:仅在特定字段更改时更新
Laravel Scout: Only update when specific fields change
我正在尝试通过仅在我关心的数据发生变化时更新我的 Algolia 记录(从而节省数千次不必要的操作)来优化我的应用程序。
我有一个 table 保存各种产品的价格信息,价格变化时每分钟更新一次。目前,Algolia 中的可搜索模型按预期与此保持同步,但这是不必要的,因为我网站上的搜索功能只提供产品本身的搜索,而不是价格。
目前,每次在模型上调用 update()
方法时,Scout 都会在 Algolia 中执行一次操作(在 each 模型上每分钟一次)。
有没有一种方法可以有条件地触发 Algolia 仅在模型的制造商、产品或变体发生变化而不是价格发生变化时进行更新?
我模型上的 toSearchableArray()
函数目前看起来像这样,如果有帮助的话:
public function toSearchableArray() {
return [
'id' => $this->id,
'manufacturer' => $this->manufacturer,
'product' => $this->product,
'variant' => $this->variant,
];
}
withoutSyncingToSearch
method是您要找的吗?
这意味着在您当前使用此方法更新价格的任何地方换行。
虽然您的问题中未提供此代码,但我假设如下:
\App\Model::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;
}
}
它将检查上次更新是否更改了可搜索数组中的任何属性,并且仅在进行了此类更新时才更新搜索索引。
我正在尝试通过仅在我关心的数据发生变化时更新我的 Algolia 记录(从而节省数千次不必要的操作)来优化我的应用程序。
我有一个 table 保存各种产品的价格信息,价格变化时每分钟更新一次。目前,Algolia 中的可搜索模型按预期与此保持同步,但这是不必要的,因为我网站上的搜索功能只提供产品本身的搜索,而不是价格。
目前,每次在模型上调用 update()
方法时,Scout 都会在 Algolia 中执行一次操作(在 each 模型上每分钟一次)。
有没有一种方法可以有条件地触发 Algolia 仅在模型的制造商、产品或变体发生变化而不是价格发生变化时进行更新?
我模型上的 toSearchableArray()
函数目前看起来像这样,如果有帮助的话:
public function toSearchableArray() {
return [
'id' => $this->id,
'manufacturer' => $this->manufacturer,
'product' => $this->product,
'variant' => $this->variant,
];
}
withoutSyncingToSearch
method是您要找的吗?
这意味着在您当前使用此方法更新价格的任何地方换行。
虽然您的问题中未提供此代码,但我假设如下:
\App\Model::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;
}
}
它将检查上次更新是否更改了可搜索数组中的任何属性,并且仅在进行了此类更新时才更新搜索索引。