Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Middle Filament

Як працює глобальний пошук у Filament і як зробити його швидким?

Глобальний пошук - поле у верхній панелі, що шукає одразу по всіх ресурсах. Ресурс бере в ньому участь, якщо в нього задано атрибут-назву запису:

protected static ?string $recordTitleAttribute = 'title';

Пошук по кількох полях і зв'язках:

public static function getGloballySearchableAttributes(): array
{
    return ['title', 'slug', 'author.name'];
}

Додаткові деталі під назвою результату:

public static function getGlobalSearchResultDetails(Model $record): array
{
    return [
        'Автор' => $record->author->name,
        'Категорія' => $record->category->name,
    ];
}

Головна пастка - N+1. Деталі звертаються до зв'язків, і без жадібного завантаження кожен результат робить окремі запити. Зв'язки треба підвантажити в запиті пошуку:

public static function getGlobalSearchEloquentQuery(): Builder
{
    return parent::getGlobalSearchEloquentQuery()->with(['author', 'category']);
}

Що ще впливає на швидкість:

  • пошук будується на LIKE '%...%' по кожному атрибуту - звичайний B-tree-індекс тут не допомагає. На великих таблицях варто обмежити кількість атрибутів і ресурсів у пошуку;
  • результатів на ресурс за замовчуванням не більше 50 ($globalSearchResultsLimit);
  • ресурс, якому пошук не потрібен, вимикають $isGloballySearchable = false;
  • ресурси без доступу (політика viewAny) у пошук не потрапляють.

Зручності: гарячі клавіші для фокусу на полі пошуку задають у панелі через globalSearchKeyBindings(['command+k', 'ctrl+k']), а до результатів можна додати дії через getGlobalSearchResultActions().

Докладніше в документації: Глобальний пошук

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання