Ключ находится в исходном коде для laravel-scout. Сначала мы должны ознакомиться с файлом Searchable.php, в конце концов, именно черта, которую мы применяем к нашей модели, запускает все волшебство. Методы доступны для поиска и unsearchable довольно ясны для своей цели.
Теперь обратите внимание на два статических метода: enableSearchSyncing и отключить синхронизацию поиска. Это позволит нам контролировать поведение синхронизации. Если мы вернемся к введению в laravel scout, то увидим следующую подсказку:
Используя наблюдателей моделей, 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
), мы говорим scout прекратить синхронизацию. Затем, когда модель удаляется, мы снова включаем синхронизацию и вызываем метод searchable
для выполнения обновления. Наша запись в базе данных поиска теперь будет обновлена с правильной отметкой времени deleted_at
.
30.03.2017