По умолчанию Laravel Scout удалит любая модель из поискового индекса после ее удаления, даже если эта модель удалена.
Вместо того, чтобы удалять, как мы можем сохранить модель в поисковом индексе и обновить ее, чтобы иметь текущую временную метку для deleted_at
?
Ключ лежит в исходном коде для Laravel-разведчик. Сначала мы должны ознакомиться с Searchable.php файл, в конце концов, это черта, которую мы применяем к нашей модели, которая запускает всю магию. Методы поиск а также непостижимый довольно ясно для их цели.
Теперь обратите внимание на два статических метода enableSearchSyncing а также disableSearchSyncing. Это позволит нам контролировать синхронизацию. Если мы оглянемся назад на вступление разведчику, он нам подсказывает:
Используя модель наблюдателей, 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);
}
...
Напомним, как это работает. Прежде чем модель deleted
(deleting
событие), мы говорим разведчику прекратить синхронизацию. Затем, когда модель удалена, мы снова включаем синхронизацию и вызываем searchable
способ выполнить обновление. Наша запись в нашей поисковой базе данных будет обновлена deleted_at
метка времени.
Нашли более простое решение (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();