Dieses Paket erleichtert die strukturierte Suche aus verschiedenen Quellen. Hier ist ein Beispiel, bei dem wir einige Modelle durchsuchen. An den Modellen selbst haben wir bereits einige kleine Vorbereitungen getroffen.
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
Die Suche wird ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. $searchResults
enthält jetzt alle User
, die john
im name
enthalten, und BlogPost
-Modelle, die „john“ im title
enthalten.
Aus Ihrer Sicht können Sie nun die Suchergebnisse durchlaufen:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
In diesem Beispiel haben wir Modelle verwendet, aber Sie können problemlos einen Suchaspekt für eine externe API, eine Dateiliste oder ein Wertearray hinzufügen.
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Sie können das Paket über Composer installieren:
composer require spatie/laravel-searchable
Um Modelle zu durchsuchen, müssen Sie ihnen erlauben, die Searchable
Schnittstelle zu implementieren.
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
Sie müssen lediglich jedem durchsuchbaren Modell eine getSearchResult
-Methode hinzufügen, die eine Instanz von SearchResult
zurückgeben muss. So könnte es für ein Blog-Post-Modell aussehen.
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
Wenn die Modelle vorbereitet sind, können Sie sie wie folgt durchsuchen:
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
Die Suche wird ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt. $searchResults
enthält jetzt alle User
, die john
im name
enthalten.
Sie können auch mehrere Attribute zum Durchsuchen übergeben:
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
Um eine feinkörnige Kontrolle zu erhalten, können Sie auch ein Callable verwenden. Auf diese Weise können Sie auch nach genauen Übereinstimmungen suchen, Bereiche anwenden, Eager-Load-Beziehungen anwenden oder Ihre Abfrage sogar filtern, wie Sie es mit dem Abfrage-Builder tun würden.
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
Sie sind nicht darauf beschränkt, nur Basismodelle als Suchaspekte zu registrieren. Sie können ganz einfach Ihre eigenen, benutzerdefinierten Suchaspekte erstellen, indem Sie die SearchAspect
-Klasse erweitern.
Berücksichtigen Sie den folgenden Aspekt der benutzerdefinierten Suche, um eine externe API zu durchsuchen:
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
So können Sie es nutzen:
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
Es ist möglich, die Menge der von jedem Aspekt zurückgegebenen Ergebnisse zu begrenzen, indem Sie limitAspectResults
vor der Durchführung der Suche aufrufen.
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
Hier ist ein Beispiel für die Darstellung von Suchergebnissen:
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
Sie können den $type
anpassen, indem Sie eine öffentliche Eigenschaft $searchableType
zu Ihrem Modell oder benutzerdefinierten Suchaspekt hinzufügen
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie einen Sicherheitsfehler gefunden haben, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.