默认情况下Laravel Scout will remove删除搜索索引中的任何模型,即使该模型被软删除。
我们如何将模型保留在搜索索引中并将其更新为deleted_at
的当前时间戳,而不是被删除?
答案 0 :(得分:2)
关键在于laravel-scout的源代码。首先,我们应该熟悉Searchable.php文件,然后我们应用于我们的模型开启所有魔法的特性。方法searchable和unsearchable非常清楚其目的。
现在注意两个静态方法enableSearchSyncing和disableSearchSyncing。这将让我们控制同步行为。如果我们回顾introduction到laravel侦察兵,它会给我们提示:
使用模型观察者,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
时间戳更新。
答案 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();