Глобальний пошук - поле у верхній панелі, що шукає одразу по всіх ресурсах. Ресурс бере в ньому участь, якщо в нього задано атрибут-назву запису:
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().