Mit diesem Laravel-Paket können Sie mehrere Eloquent-Modelle durchsuchen. Es unterstützt Sortierung, Paginierung, bereichsbezogene Abfragen, Eager-Load-Beziehungen und die Suche in einzelnen oder mehreren Spalten.
❤️ Wir sind stolz darauf, die Community zu unterstützen, indem wir Laravel-Pakete entwickeln und diese kostenlos verschenken. Wenn Sie mit diesem Paket Zeit sparen oder sich beruflich darauf verlassen, denken Sie bitte darüber nach, die Wartung und Entwicklung zu sponsern und schauen Sie sich unser neuestes Premium-Paket an: Inertia Table. Es braucht Zeit, den Überblick über Probleme und Pull-Requests zu behalten, aber wir helfen Ihnen gerne weiter!
Wenn Sie mehr über den Hintergrund dieses Pakets erfahren möchten, lesen Sie bitte den Blogbeitrag.
Sie können das Paket über Composer installieren:
composer require protonemedia/laravel-cross-eloquent-search
get
-Methode wurde in search
umbenannt.addWhen
-Methode wurde zugunsten von when
entfernt.updated_at
. Wenn Sie keine Zeitstempel verwenden, wird jetzt standardmäßig der Primärschlüssel verwendet. startWithWildcard
-Methode wurde in beginWithWildcard
umbenannt.getUpdatedAtColumn
ausgewertet. Zuvor war es fest in updated_at
codiert. Sie können weiterhin eine andere Spalte zum Sortieren verwenden.allowEmptySearchQuery
und die Klasse EmptySearchQueryException
wurden entfernt, Sie können jedoch weiterhin Ergebnisse ohne Suche erhalten. Beginnen Sie Ihre Suchanfrage, indem Sie ein oder mehrere Modelle zum Durchsuchen hinzufügen. Rufen Sie die add
-Methode mit dem Klassennamen des Modells und der Spalte auf, die Sie durchsuchen möchten. Rufen Sie dann die search
mit dem Suchbegriff auf und Sie erhalten eine IlluminateDatabaseEloquentCollection
Instanz mit den Ergebnissen.
Die Ergebnisse werden standardmäßig in aufsteigender Reihenfolge nach der aktualisierten Spalte sortiert. In den meisten Fällen lautet diese Spalte updated_at
. Wenn Sie UPDATED_AT
Konstante Ihres Modells angepasst oder die getUpdatedAtColumn
-Methode überschrieben haben, verwendet dieses Paket die angepasste Spalte. Wenn Sie überhaupt keine Zeitstempel verwenden, wird standardmäßig der Primärschlüssel verwendet. Natürlich können Sie auch nach einer anderen Spalte bestellen.
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Wenn Ihnen die Einrückung wichtig ist, können Sie optional die new
Methode an der Fassade verwenden:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
Es gibt auch eine when
-Methode, um bestimmte Klauseln basierend auf einer anderen Bedingung anzuwenden:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
Standardmäßig teilen wir den Suchbegriff auf und jedes Schlüsselwort erhält ein Platzhaltersymbol, um eine teilweise Übereinstimmung zu erzielen. Praktisch bedeutet dies, dass der Suchbegriff apple ios
zu apple%
und ios%
führt. Wenn Sie möchten, dass am Anfang auch ein Platzhaltersymbol steht, können Sie die Methode beginWithWildcard
aufrufen. Dies führt zu %apple%
und %ios%
.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
Hinweis: In früheren Versionen dieses Pakets hieß diese Methode startWithWildcard()
.
Wenn Sie das Verhalten deaktivieren möchten, wenn ein Platzhalter an die Begriffe angehängt wird, sollten Sie die Methode endWithWildcard
mit false
aufrufen:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
Die Suche nach mehreren Wörtern wird standardmäßig unterstützt. Setzen Sie Ihre Phrase einfach in doppelte Anführungszeichen.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
Sie können das Parsen des Suchbegriffs deaktivieren, indem Sie die Methode dontParseTerm
aufrufen. Dadurch erhalten Sie die gleichen Ergebnisse wie bei Verwendung von doppelten Anführungszeichen.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
Wenn Sie die Ergebnisse nach einer anderen Spalte sortieren möchten, können Sie diese Spalte als dritten Parameter an die add
-Methode übergeben. Rufen Sie die Methode orderByDesc
auf, um die Ergebnisse in absteigender Reihenfolge zu sortieren.
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
Sie können die Methode orderByRelevance
aufrufen, um die Ergebnisse nach der Häufigkeit des Vorkommens der Suchbegriffe zu sortieren. Stellen Sie sich diese beiden Sätze vor:
Wenn Sie nach „Apple iPad“ suchen, wird der zweite Satz zuerst angezeigt, da es mehr Treffer für die Suchbegriffe gibt.
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
Die Sortierung nach Relevanz wird nicht unterstützt, wenn Sie (verschachtelte) Beziehungen durchsuchen.
Um die Ergebnisse nach Modelltyp zu sortieren, können Sie die Methode orderByModel
verwenden, indem Sie ihr Ihre bevorzugte Reihenfolge der Modelle zuweisen:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
Wir empfehlen dringend, Ihre Ergebnisse zu paginieren. Rufen Sie die paginate
-Methode vor der search
auf und Sie erhalten als Ergebnis eine Instanz von IlluminateContractsPaginationLengthAwarePaginator
. Die paginate
Methode benötigt drei (optionale) Parameter, um den Paginator anzupassen. Diese Argumente sind die gleichen wie beim Datenbank-Paginator von Laravel.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Sie können auch eine einfache Paginierung verwenden. Dadurch wird eine Instanz von IlluminateContractsPaginationPaginator
zurückgegeben, die keine Längenerkennung hat:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
Anstelle des Klassennamens können Sie auch eine Instanz des Eloquent Query Builders an die add
-Methode übergeben. Dadurch können Sie jedem Modell Einschränkungen hinzufügen.
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
Sie können mehrere Spalten durchsuchen, indem Sie als zweites Argument ein Spaltenarray übergeben.
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
Sie können (verschachtelte) Beziehungen durchsuchen, indem Sie die Punktnotation verwenden:
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
Sie können die Volltextsuche von MySQL verwenden, indem Sie die Methode addFullText
verwenden. Sie können eine einzelne oder mehrere Spalten durchsuchen (mithilfe von Volltextindizes) und Sie können eine Reihe von Optionen angeben, um beispielsweise den Modus festzulegen. Sie können sogar reguläre und Volltextsuchen in einer Abfrage kombinieren:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
Wenn Sie Beziehungen durchsuchen möchten, müssen Sie ein Array übergeben, wobei der Array-Schlüssel die Beziehung enthält, während der Wert ein Array von Spalten ist:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL verfügt über einen integrierten Soundex -Algorithmus, sodass Sie nach Begriffen suchen können, die fast gleich klingen. Sie können diese Funktion nutzen, indem Sie die Methode soundsLike
aufrufen:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
Hier gibt es nicht viel zu erklären, aber das wird auch unterstützt :)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
Sie rufen die search
ohne Begriff oder mit einem leeren Begriff auf. In diesem Fall können Sie das zweite Argument der add
-Methode verwerfen. Mit der Methode orderBy
können Sie die Spalte festlegen, nach der sortiert werden soll (bisher das dritte Argument):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
Sie können die Anzahl der Ergebnisse mit der count
zählen:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
Mit includeModelType
können Sie den Modelltyp zum Suchergebnis hinzufügen.
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
Standardmäßig wird der type
verwendet. Sie können dies jedoch anpassen, indem Sie den Schlüssel an die Methode übergeben.
Sie können den type
auch anpassen, indem Sie Ihrem Modell eine öffentliche Methode searchType()
hinzufügen, um den Standardnamen der Klassenbasis zu überschreiben.
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
Sie können den Parser mit der parseTerms
-Methode verwenden:
$ terms = Search :: parseTerms ( ' drums guitar ' );
Sie können auch einen Rückruf als zweites Argument übergeben, um jeden Begriff zu durchlaufen:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Inertia Table
: Die ultimative Tabelle für Inertia.js mit integriertem Query Builder.Laravel Blade On Demand
: Laravel-Paket zum Kompilieren von Blade-Vorlagen im Speicher.Laravel Eloquent Scope as Select
: Hören Sie auf, Ihre Eloquent-Abfragebereiche und -Einschränkungen in PHP zu duplizieren. Mit diesem Paket können Sie Ihre Abfragebereiche und -einschränkungen wiederverwenden, indem Sie sie als Unterabfrage hinzufügen.Laravel FFMpeg
: Dieses Paket bietet eine Integration mit FFmpeg für Laravel. Die Speicherung der Dateien erfolgt über das Dateisystem von Laravel.Laravel MinIO Testing Tools
: Führen Sie Ihre Tests auf einem MinIO S3-Server aus.Laravel Mixins
: Eine Sammlung von Laravel-Goodies.Laravel Paddle
: Paddle.com-API-Integration für Laravel mit Unterstützung für Webhooks/Events.Laravel Task Runner
: Schreiben Sie Shell-Skripte wie Blade Components und führen Sie sie lokal oder auf einem Remote-Server aus.Laravel Verify New Email
: Dieses Paket fügt Unterstützung für die Verifizierung neuer E-Mail-Adressen hinzu: Wenn ein Benutzer seine E-Mail-Adresse aktualisiert, wird die alte nicht ersetzt, bis die neue verifiziert wurde.Laravel XSS Protection
: Laravel-Middleware zum Schutz Ihrer App vor Cross-Site-Scripting (XSS). Es bereinigt Anforderungseingaben und kann Blade-Echo-Anweisungen bereinigen.Wenn Sie sicherheitsrelevante Probleme entdecken, 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.
Dieses Paket ist Treeware. Wenn Sie es in der Produktion verwenden, bitten wir Sie, der Welt einen Baum zu kaufen, um uns für unsere Arbeit zu danken. Indem Sie zum Treeware-Wald beitragen, schaffen Sie Arbeitsplätze für einheimische Familien und stellen Lebensräume für Wildtiere wieder her.