Хобрук: Ваш путь к мастерству в программировании

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

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

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


Ответы:


1

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

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();
19.12.2017
Новые материалы

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

Быстрая разработка: волшебный мир больших языковых моделей
РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..

Ускоренный курс по Node Redis
Сегодня мы будем учиться использовать Redis в Node.js, однако я не собираюсь вываливать сюда всю документацию и утомлять вас до смерти. Это руководство для начинающих? — спросите вы. Ну..

Обзор Python для науки о данных и машинного обучения
Python стал наиболее предпочтительным языком программирования среди разработчиков, которые в основном занимаются наукой о данных и машинным обучением. Интуитивно понятные и уникальные функции..

Принудительный сброс состояния компонента React с помощью ключевого свойства
Принудительный сброс состояния компонента React с помощью ключевого свойства Знаете ли вы, что вы можете использовать опору key для принудительного сброса состояния компонента? В..