3

默认情况下,Laravel Scout 会在删除搜索索引时从搜索索引中删除任何模型,即使该模型被软删除。

我们如何将模型保留在搜索索引中并更新它以获得当前时间戳,而不是被删除deleted_at

4

1 回答 1

3

关键在于laravel-scout的源代码。首先我们应该熟悉Searchable.php文件,毕竟它是我们应用于模型的特性,它开启了所有的魔力。可搜索不可搜索的方法非常清楚它们的目的。

现在注意两个静态方法enableSearchSyncingdisableSearchSyncing。这将让我们控制同步行为。如果我们回顾一下 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);
    }

...

回顾一下这是如何工作的。在模型deleteddeleting事件)之前,我们告诉 scout 停止同步。然后当模型被删除时,我们重新启用同步,并调用该searchable方法执行更新。我们在搜索数据库中的记录现在将使用正确的deleted_at时间戳进行更新。

于 2017-03-30T14:32:40.180 回答