Laravel Scout - 搜索已删除的记录并保持软删除模型的更新

时间:2017-03-30 14:01:37

标签: php laravel elasticsearch algolia laravel-scout

默认情况下Laravel Scout will remove删除搜索索引中的任何模型,即使该模型被软删除。

我们如何将模型保留在搜索索引中并将其更新为deleted_at的当前时间戳,而不是被删除?

2 个答案:

答案 0 :(得分:2)

关键在于laravel-scout的源代码。首先,我们应该熟悉Searchable.php文件,然后我们应用于我们的模型开启所有魔法的特性。方法searchableunsearchable非常清楚其目的。

现在注意两个静态方法enableSearchSyncingdisableSearchSyncing。这将让我们控制同步行为。如果我们回顾introduction到laravel侦察兵,它会给我们提示:

  

使用模型观察者,Scout会自动保留您的搜索   索引与您的Eloquent记录同步。

所以我们应该把注意力转向ModelObserver.php。这就是一切都发生的地方。观察者会照看四个模型事件,createdupdateddeletedrestored

updatedrestored只需调用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);
    }

...

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

答案 1 :(得分:0)

找到了一个更简单的解决方案(Laravel 5.5,Algolia):

只需添加到config \ scout.php

即可
'soft_delete' => true

并制作

artisan scout:flush 
artisan scout:import 

它应该为可搜索的模型添加__soft_deleted attirbute。您可以使用以下功能:

User::search('')->withTrashed()->get();
User::search('')->onlyTrashed()->get();