Laravel Scout — поиск в удаленных записях и постоянное обновление удаленных моделей

По умолчанию Laravel Scout удалит любая модель из поискового индекса после ее удаления, даже если эта модель удалена.

Вместо того, чтобы удалять, как мы можем сохранить модель в поисковом индексе и обновить ее, чтобы иметь текущую временную метку для deleted_at?

2

Решение

Ключ лежит в исходном коде для 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 метка времени.

2

Другие решения

Нашли более простое решение (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();
0

По вопросам рекламы [email protected]