默认情况下,Laravel Scout 会在删除搜索索引时从搜索索引中删除任何模型,即使该模型被软删除。
我们如何将模型保留在搜索索引中并更新它以获得当前时间戳,而不是被删除deleted_at
?
默认情况下,Laravel Scout 会在删除搜索索引时从搜索索引中删除任何模型,即使该模型被软删除。
我们如何将模型保留在搜索索引中并更新它以获得当前时间戳,而不是被删除deleted_at
?
关键在于laravel-scout的源代码。首先我们应该熟悉Searchable.php文件,毕竟它是我们应用于模型的特性,它开启了所有的魔力。可搜索和不可搜索的方法非常清楚它们的目的。
现在注意两个静态方法enableSearchSyncing和disableSearchSyncing。这将让我们控制同步行为。如果我们回顾一下 laravel scout 的介绍,它给了我们这样的提示:
使用模型观察者,Scout 将自动使您的搜索索引与您的 Eloquent 记录保持同步。
所以我们应该把注意力转向ModelObserver.php。这就是一切发生的地方。观察者负责四个模型事件,创建、更新、删除和恢复。
updated
,然后restored
简单地调用该created
方法,该方法将检查是否确保未禁用同步,然后运行$model->searchable()
.
deleted
,我们要防止发生的事情非常相似。它将检查是否启用了同步,然后运行$model->unsearchable();
.
现在我们了解了它是如何工作的,得到我们想要的效果就相对简单了。我们将从童子军手册中取出一页,并在删除时使用观察者来更新我们的搜索索引。这是它的样子:
class UserObserver
{
/**
* Listen to the User deleting event.
*
* @param User $user
*/
public function deleting(User $user)
{
$user::disableSearchSyncing();
}
/**
* Listen to the User deleted event.
*
* @param User $user
*/
public function deleted(User $user)
{
$user::enableSearchSyncing();
$user->searchable();
}
}
创建观察者后,请确保不要忘记将其添加到 AppServiceProvider 的引导方法中,否则它将永远不会被注册。
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
User::observe(UserObserver::class);
}
...
回顾一下这是如何工作的。在模型deleted
(deleting
事件)之前,我们告诉 scout 停止同步。然后当模型被删除时,我们重新启用同步,并调用该searchable
方法执行更新。我们在搜索数据库中的记录现在将使用正确的deleted_at
时间戳进行更新。