Search — Scout + Meilisearch
Full-text search across matters, clients, documents, and firm members using Laravel Scout with Meilisearch as the backend.
Searchable Models
| Model | Searchable Fields | Index Name |
|---|---|---|
Matter | title, case_number, description | matters |
Client | display_name, company_name, email | clients |
Document | title, description, category | documents |
FirmUserProfile | display_name, job_title, practice_title | firm_user_profiles |
Model Configuration
// app/Models/Matter/Matter.php
use Laravel\Scout\Searchable;
class Matter extends Model
{
use Searchable;
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'title' => $this->title,
'case_number' => $this->case_number,
'description' => $this->description,
'law_firm_id' => $this->law_firm_id, // for tenant filtering
'status' => $this->status,
];
}
public function searchableAs(): string
{
return 'matters';
}
}
Tenant-Scoped Search
Meilisearch filters are applied on every search query to enforce firm isolation:
Matter::search($query)
->where('law_firm_id', Filament::getTenant()->id)
->get();
Meilisearch Index Settings
// In a seeder or artisan command
MeiliSearch::index('matters')->updateFilterableAttributes(['law_firm_id', 'status']);
MeiliSearch::index('matters')->updateSortableAttributes(['created_at', 'title']);