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

问题描述 投票:2回答:2

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

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

php laravel elasticsearch algolia laravel-scout
2个回答
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事件)之前,我们告诉侦察员停止同步。然后,当删除模型时,我们重新启用同步,并调用searchable方法来执行更新。我们在搜索数据库中的记录现在将使用正确的deleted_at时间戳进行更新。


0
投票

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

只需添加到config \ scout.php即可

'soft_delete' => true

和做

artisan scout:flush 
artisan scout:import 

它应该将__soft_deleted属性添加到可搜索的模型中。你可以使用以下功能:

User::search('')->withTrashed()->get();
User::search('')->onlyTrashed()->get();
© www.soinside.com 2019 - 2024. All rights reserved.