跳到主要内容
版本:3.0

全局搜索

概述

全局搜索允许你在应用的任何地方搜索所有的资源记录。

设置全局搜索结果标题

要在模型中启用全局搜索,你必须先为资源设置一个 title 属性

protected static ?string $recordTitleAttribute = 'title';

这一属性用于检索搜索记录结果的标题。

你的资源中需要有编辑页或查看页,这样全局搜索结果才可以链接到对应页面,否则不会返回该资源的结果。

你可以重写 getGlobalSearchResultTitle() 方法进一步自定义 title:

public static function getGlobalSearchResultTitle(Model $record): string
{
return $record->name;
}

多字段搜索

如果你想要在资源中搜索多个字段,你可以重写 getGloballySearchableAttributes() 方法。“点语法”让你可以搜索关联的内部:

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

添加额外详情到全局搜索结果

搜索结果可以在标题的下面显示“详情(Details)”,让用户获取更多记录信息。要启用此特性,你必须重写 getGlobalSearchResultDetails() 方法:

public static function getGlobalSearchResultDetails(Model $record): array
{
return [
'Author' => $record->author->name,
'Category' => $record->category->name,
];
}

此例中,记录的分类和作者会显示在搜索结果的标题下面。不过,categoryauthor 关联是通过懒加载实现,会导致搜索结果的性能不佳。想要积极加载这些关联,必须重写 getGlobalSearchEloquentQuery() 方法:

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

自定义全局搜索结果 URL

全局搜索结果会链接到资源的编辑页,或者在用户没有编辑权限时链接到查看页。你可以重写 getGlobalSearchResultUrl() 方法并返回你想使用的路由,进行自定义:

public static function getGlobalSearchResultUrl(Model $record): string
{
return UserResource::getUrl('edit', ['record' => $record]);
}

添加 Action 到全局搜索结果

全局搜索支持 Action,将其在每个搜索结果中渲染成按钮。籍此可以打开一个网址或者发起一个 Livewire 事件。

Action 可以定义如下:

use Filament\GlobalSearch\Actions\Action;

public static function getGlobalSearchResultActions(Model $record): array
{
return [
Action::make('edit')
->url(static::getUrl('edit', ['record' => $record])),
];
}

了解更多 Action 按钮样式请点击此处

全局搜索 Action 中打开 URL

当点击 Action 时,你可以打开 URL(可选新标签页):

use Filament\GlobalSearch\Actions\Action;

Action::make('view')
->url(static::getUrl('view', ['record' => $record]), shouldOpenInNewTab: true)

全局搜索 Action 中发送 Livewire 事件

有时候,你希望在点击全局搜索结果 Action 时,执行额外的代码。通过设置点击 Action 时发送 Livewire 事件,可以达成该效果。你可以传入一个可选的数据数组,这个数组在 Livewire 组件的事件监听者中作为参数使用:

use Filament\GlobalSearch\Actions\Action;

Action::make('quickView')
->dispatch('quickView', [$record->id])

限制全局搜索结果的数量

默认情况下,全局搜索每个资源会返回多达 50 个结果。你可以重写资源标签上的 $globalSearchResultsLimit 属性对其自定义:

protected static int $globalSearchResultsLimit = 20;

禁用全局搜索

如上所述,当你为资源设置 title 属性时,全局搜索会自动启用。而有时,你只想指定 title 属性而不想启用全局搜索。

为此,可以在配置中禁用全局搜索:

use Filament\Panel;

public function panel(Panel $panel): Panel
{
return $panel
// ...
->globalSearch(false);
}

注册全局搜索键盘绑定

全局搜索字段可以使用键盘快捷键打开。要设置此项,在配置中传入 globalSearchKeyBindings() 方法:

use Filament\Panel;

public function panel(Panel $panel): Panel
{
return $panel
// ...
->globalSearchKeyBindings(['command+k', 'ctrl+k']);
}

全局搜索强制大小写不敏感

默认情况下,搜索会使用数据库列的敏感设置。这是为了在搜索大量数据集的时候,避免非必要的性能开销。不过,如果你的数据库默认不搜索大小写不敏感,你可以使用 $isGlobalSearchForcedCaseInsensitive 属性强制它:

protected static bool $isGlobalSearchForcedCaseInsensitive = true;