【发布时间】:2017-03-30 14:01:37
【问题描述】:
默认情况下,Laravel Scout will remove 删除搜索索引中的任何模型,即使该模型被软删除。
我们如何才能将模型保留在搜索索引中并更新它以获取deleted_at 的当前时间戳,而不是被删除?
【问题讨论】:
标签: php laravel elasticsearch algolia laravel-scout
默认情况下,Laravel Scout will remove 删除搜索索引中的任何模型,即使该模型被软删除。
我们如何才能将模型保留在搜索索引中并更新它以获取deleted_at 的当前时间戳,而不是被删除?
【问题讨论】:
标签: php laravel elasticsearch algolia laravel-scout
关键在于laravel-scout的源代码。首先我们应该熟悉Searchable.php 文件,毕竟它是我们应用于模型的特性,它开启了所有的魔力。 searchable 和 unsearchable 方法的用途非常明确。
现在注意两个静态方法enableSearchSyncing 和disableSearchSyncing。这将让我们控制同步行为。如果我们回顾 introduction 到 laravel scout,它给了我们这样的提示:
使用模型观察者,Scout 会自动保留您的搜索 与您的 Eloquent 记录同步的索引。
所以我们应该把注意力转向ModelObserver.php。这就是一切发生的地方。观察者负责四个模型事件,created、updated、deleted 和 restored。
updated 和restored 只需调用created 方法,该方法将检查是否确保未禁用同步,然后运行$model->searchable()。
deleted,我们要防止发生的事情非常相似。它将检查是否启用了同步,然后运行$model->unsearchable();。
既然我们了解了它的工作原理,那么获得我们想要的效果就相对简单了。我们将从童子军手册中取出一页,并在删除时使用observers 来更新我们的搜索索引。这是它的样子:
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 时间戳进行更新。
【讨论】: