Installation
composer require kainiklas/filament-scout
Publish the config (if needed):
php artisan vendor:publish --provider="Kainiklas\FilamentScout\FilamentScoutServiceProvider"
Configure Scout Driver
Ensure your config/scout.php is properly set up (e.g., Algolia, Meilisearch, or database driver). Example for Algolia:
'driver' => env('SCOUT_DRIVER', 'algolia'),
'algolia' => [
'id' => env('ALGOLIA_APP_ID'),
'secret' => env('ALGOLIA_SECRET'),
'index_prefix' => env('ALGOLIA_INDEX_PREFIX', ''),
],
Enable Plugin in Filament
Register the plugin in app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\Kainiklas\FilamentScout\Plugin::make(),
]);
}
First Use Case: Global Search
Ensure your model uses HasSearchable trait and has a toSearchableArray() method:
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
public function toSearchableArray()
{
return [
'title' => $this->title,
'body' => $this->body,
];
}
}
Now, Filament’s global search will automatically leverage Scout for indexed models.
Table Search Integration
Use the ScoutSearch column type in Filament tables:
use Kainiklas\FilamentScout\Columns\ScoutSearchColumn;
public static function table(Table $table): Table
{
return $table
->columns([
ScoutSearchColumn::make('title'), // Searches the 'title' field in Scout
]);
}
Customizing Search Fields
Override toSearchableArray() for granular control:
public function toSearchableArray()
{
return [
'custom_field' => $this->title . ' ' . $this->slug,
];
}
ScoutSelect Component
Replace standard Select fields with ScoutSelect for autocomplete:
use Kainiklas\FilamentScout\Forms\Components\ScoutSelect;
public static function form(Form $form): Form
{
return $form
->components([
ScoutSelect::make('author_id')
->label('Author')
->options(Author::class), // Model class for Scout indexing
]);
}
Bulk Actions with Scout Combine Scout with Filament’s bulk actions:
public static function table(Table $table): Table
{
return $table
->actions([
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
Scout ensures fast filtering even with large datasets.
$table->columns([
ScoutSearchColumn::make('title'), // Scout-powered
TextColumn::make('status'), // Database query
]);
shouldBeSearchable():
public function shouldBeSearchable()
{
return !$this->deleted_at;
}
searchable event to sync changes:
protected static function booted()
{
static::saved(function ($model) {
$model->searchable();
});
}
Indexing Delays
Scout may not reflect real-time changes immediately. Use searchable() manually or set up a queue job:
Post::find($id)->searchable(); // Force reindex
Or queue it:
Post::find($id)->searchable()->afterCommit();
Case Sensitivity
Scout’s default search is case-insensitive, but some drivers (e.g., Meilisearch) may vary. Configure in config/scout.php:
'meilisearch' => [
'searchable_attributes' => ['title', 'body'],
'sortable_attributes' => ['title'],
'filterable_attributes' => [],
],
Pagination Conflicts
Scout’s cursor() pagination may clash with Filament’s default. Override in your resource:
public static function getPages(): array
{
return [
'index' => Pages\ListPosts::route('/'),
];
}
php artisan scout:flush "App\Models\Post"
php artisan scout:import "App\Models\Post"
config/scout.php:
'log' => env('SCOUT_LOG', false),
php artisan filament:cache-clear
php artisan scout:flush
Custom Search Logic
Extend ScoutSearchColumn for custom behavior:
use Kainiklas\FilamentScout\Columns\ScoutSearchColumn;
class CustomScoutSearchColumn extends ScoutSearchColumn
{
protected function getSearchableFields(): array
{
return ['title', 'custom_meta'];
}
}
Driver-Specific Config Override Scout’s driver config per model:
class Post extends Model
{
use Searchable;
public function searchableAs()
{
return 'posts_custom_index';
}
}
Fallback to Database
Implement a fallback for unindexed models in ScoutSearchColumn:
protected function getFallbackQuery(): Builder
{
return $this->getModel()::query()
->where('title', 'like', '%' . $this->getQuery() . '%');
}
Performance Tuning Limit Scout results in Filament tables:
ScoutSearchColumn::make('title')
->limit(100) // Reduce memory usage
->debounce(500), // Adjust for UI responsiveness
How can I help you explore Laravel packages today?