Das offizielle Paket, das Eloquent-Modellen Volltextsuche hinzufügt. Unterstützt Meilisearch, Algolia, Typesense und Datenbank-Engines und synchronisiert Indizes über Modell-Observer automatisch.
Laravel Scout ist eine einfache, treiber-basierte Lösung, um Eloquent-Modellen Volltextsuche hinzuzufügen. Über Modell-Observer werden Eloquent-Datensätze automatisch mit dem Suchindex synchronisiert.Scout bringt eine integrierte database-Engine mit, die Volltextindizes und LIKE-Klauseln von MySQL/PostgreSQL nutzt – ohne externen Dienst. Für große Produktivumgebungen mit Tippfehler-Toleranz, Facettensuche oder Geo-Suche sind externe Engines im Vorteil.
Ergänzen Sie schließlich das Trait Laravel\Scout\Searchable in jedem Modell, das durchsuchbar sein soll. Das Trait registriert einen Model-Observer und aktiviert die automatische Synchronisation mit dem Suchtreiber.
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable;class Post extends Model{ use Searchable;}
Für alle Engines außer database und collection empfehlen wir dringend, Queues einzurichten. Ein Worker verlagert Index-Synchronisationen in den Hintergrund und verbessert die Reaktionszeit der Weboberfläche erheblich.Setzen Sie in config/scout.php die Option queue auf true.
In schreiblastigen Anwendungen möchten Sie duplizierte Index-Jobs für denselben Datensatz vermeiden. Registrieren Sie in config/scout.php – üblicherweise in der boot-Methode eines Service-Providers – die Job-Klassen MakeSearchableUniquely und RemoveFromSearchUniquely.
use Laravel\Scout\Jobs\MakeSearchableUniquely;use Laravel\Scout\Jobs\RemoveFromSearchUniquely;use Laravel\Scout\Scout;Scout::makeSearchableUsing(MakeSearchableUniquely::class);Scout::removeFromSearchUsing(RemoveFromSearchUniquely::class);
Diese Jobs nutzen Laravels Unique-Job-Locks, um doppelte Index-Operationen für denselben Datensatz zu vermeiden.
Ideal, wenn Sie ohne externen Dienst suchen möchten.Die Datenbank-Engine nutzt Volltextindizes und LIKE-Klauseln von MySQL/PostgreSQL und reicht für die meisten Anwendungen.
SCOUT_DRIVER=database
Die Collection-Engine filtert in PHP und funktioniert auf allen von Laravel unterstützten Datenbanken (auch SQLite). Ideal für lokale Entwicklung, Tests und kleine Datensätze.
SCOUT_DRIVER=collection
Anders als bei externen Engines müssen Sie bei der Datenbank-Engine keinen Index manuell pflegen. Es wird direkt in der Tabelle gesucht.
Standardmäßig werden alle Daten aus toArray() in den Suchindex geschrieben. Um die Daten zu steuern, überschreiben Sie toSearchableArray.
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Model;use Laravel\Scout\Searchable;class Post extends Model{ use Searchable; /** * Gibt die für den Index vorgesehenen Daten des Modells zurück. * * @return array<string, mixed> */ public function toSearchableArray(): array { $array = $this->toArray(); // Daten anpassen... return $array; }}
Die Befehle in diesem Abschnitt sind vor allem für externe Engines (Algolia, Meilisearch, Typesense) relevant. Bei der Datenbank-Engine ist keine Index-Verwaltung nötig.
use App\Models\Order;// Gleichheit$orders = Order::search('Star Trek')->where('user_id', 1)->get();// In einer Menge$orders = Order::search('Star Trek')->whereIn('status', ['open', 'paid'])->get();// Nicht in einer Menge$orders = Order::search('Star Trek')->whereNotIn('status', ['closed'])->get();
Bei Meilisearch müssen Sie vor dem Einsatz von where die filterbaren Attribute definieren.
Scout holt zunächst die IDs aus der Such-Engine und dann die Modelle über Eloquent. Um N+1-Probleme zu vermeiden, geben Sie in query mit with() Eager Loading an.
Für Eager Loading bei Batch-Imports definieren Sie makeAllSearchableUsing.
use Illuminate\Database\Eloquent\Builder;protected function makeAllSearchableUsing(Builder $query): Builder{ return $query->with('author');}
Bei queue-basierten Batch-Imports kann makeAllSearchableUsing nicht immer verwendet werden. Beziehungen werden im Queue-Job für eine Modell-Collection ggf. nicht wiederhergestellt.
Reichen die eingebauten Engines nicht aus, implementieren Sie eine eigene. Erben Sie von der abstrakten Klasse Laravel\Scout\Engines\Engine und implementieren Sie folgende Methoden:
use Laravel\Scout\Builder;abstract public function update($models);abstract public function delete($models);abstract public function search(Builder $builder);abstract public function paginate(Builder $builder, $perPage, $page);abstract public function mapIds($results);abstract public function map(Builder $builder, $results, $model);abstract public function getTotalCount($results);abstract public function flush($model);
Als Vorlage können Sie sich die Klasse Laravel\Scout\Engines\AlgoliaEngine ansehen.Registrieren Sie die Engine in der boot-Methode Ihres AppServiceProvider.
use App\ScoutExtensions\MySqlSearchEngine;use Laravel\Scout\EngineManager;public function boot(): void{ resolve(EngineManager::class)->extend('mysql', function () { return new MySqlSearchEngine; });}
Nach der Registrierung wählen Sie sie in config/scout.php als Treiber aus.