Dieses Paket fügt Such-/Filterfunktionen zu Eloquent-Modellen in Laravel 4/5/6 hinzu.
Sie könnten diese Pakete auch nützlich finden:
Fügen Sie der Datei composer.json
in Ihrem Projekt die folgende Zeile hinzu:
"jedrzej/searchable": "0.0.17"
oder führen Sie Folgendes in der Befehlszeile im Stammordner Ihres Projekts aus:
composer require "jedrzej/searchable" "0.0.17"
Um ein Eloquent-Modell durchsuchbar zu machen, fügen Sie das Merkmal zum Modell hinzu und definieren Sie eine Liste von Feldern, nach denen das Modell gefiltert werden kann. Sie können entweder eine $searchable-Eigenschaft definieren oder eine getSearchableAttributes-Methode implementieren, wenn Sie eine Logik ausführen möchten, um eine Liste durchsuchbarer Felder zu definieren.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of searchable fields...
public $ searchable = [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
// ...or a method that returns a list of searchable fields
public function getSearchableAttributes ()
{
return [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
}
}
Um alle Felder durchsuchbar zu machen, fügen Sie in der Liste der durchsuchbaren Felder ein Sternchen * ein:
public $ searchable = [ ' * ' ];
Es ist auch möglich, die Attribute des Modells auf die schwarze Liste zu setzen, um zu verhindern, dass es gefiltert wird.
Sie können entweder eine $notSearchable-Eigenschaft definieren oder eine getNotSearchableAttributes-Methode implementieren, wenn Sie eine Logik ausführen möchten, um eine Liste durchsuchbarer Felder zu definieren.
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of not searchable fields...
public $ notSearchable = [ ' created_at ' ];
// ...or a method that returns a list of not searchable fields
public function getNotSearchableAttributes ()
{
return [ ' created_at ' ];
}
}
Wenn Sie beide Listen definieren – durchsuchbare und nicht durchsuchbare Spalten – enthält der resultierende Satz durchsuchbarer Felder alle Attribute auf der Whitelist mit Ausnahme aller Attribute auf der Blacklist.
SearchableTrait
fügt dem Modell einen filtered()
-Bereich hinzu – Sie können ihm eine Abfrage übergeben, die ein Array von Filterbedingungen ist:
// return all posts with forum_id equal to $forum_id
Post :: filtered ([ ' forum_id ' => $ forum_id ])-> get ();
// return all posts with with <operator> applied to forum_id
Post :: filtered ([ ' forum_id ' => <operator>])-> get ();
oder es wird Request::all()
als Standard verwendet:
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
Der Standardabfragemodus besteht darin, die Konjunktion ( AND
) aller Abfragen auf das durchsuchbare Modell anzuwenden. Sie kann in Disjunktion ( OR
) geändert werden, indem der Wert des mode
auf or
gesetzt wird. Wenn der mode
Abfrageparameter bereits verwendet wird, wird der von getQueryMode
-Methode zurückgegebene Name verwendet.
Das SearchableTrait
unterstützt die folgenden Operatoren:
Vergleichsoperatoren ermöglichen das Filtern basierend auf dem Vergleichsergebnis des Modellattributs und des Abfragewerts. Sie funktionieren für Zeichenfolgen, Zahlen und Datumsangaben. Sie haben das folgende Format:
(<operator>)<value>
Folgende Vergleichsoperatoren stehen zur Verfügung:
gt
für greater than
Vergleichge
für greater than or equal
-Vergleichlt
für less than
einen Vergleich, zle
für les than or equal
VergleichUm Beiträge aus dem Jahr 2015 und neuer zu filtern, sollte die folgende Abfrage verwendet werden:
?created_at=(ge)2015-01-01
Das durchsuchbare Merkmal ermöglicht das Filtern nach dem genauen Wert eines Attributs oder nach einer Reihe von Werten, abhängig von der Art des als Abfrageparameter übergebenen Werts. Wenn der Wert Kommas enthält, wird der Parameter in Kommas aufgeteilt und als Array-Eingabe für IN
Filterung verwendet, andernfalls wird eine exakte Übereinstimmung angewendet.
Um Beiträge von Benutzern mit der ID 42 zu filtern, sollte die folgende Abfrage verwendet werden:
?user_id=42
Um Beiträge aus Foren mit der ID 7 oder 8 zu filtern, sollte die folgende Abfrage verwendet werden:
?forum_id=7,8
Like-Operatoren ermöglichen das Filtern mithilfe der LIKE
Abfrage. Dieser Operator wird ausgelöst, wenn der Operator „Genaue Übereinstimmung“ verwendet wird, der Wert jedoch %
-Zeichen als erstes oder letztes Zeichen enthält.
Um Beiträge zu filtern, die mit How
beginnen, sollte die folgende Abfrage verwendet werden:
?title=How%
Notice:
Das Prozentzeichen wird zum Kodieren von Sonderzeichen in URLs verwendet. Stellen Sie daher beim Senden der Anfrage sicher, dass die von Ihnen verwendeten Tools encode the % character as %25
Der Nulloperator (null)
ermöglicht das Filtern von Modellen, deren Attribut null ist.
Um Beiträge zu filtern, die keinen Anhang haben, sollte die folgende Abfrage verwendet werden:
?attachment_id=(null)
Es ist möglich, negierte Ergebnisse einer Abfrage zu erhalten, indem dem Operator !
vorangestellt wird. .
Einige Beispiele:
//filter posts from all forums except those with id 7 or 8
?forum_id=!7,8
//filter posts older than 2015
?created_at=!(ge)2015
//filter posts with attachment
?attachment_id=!(null)
Es ist möglich, mehrere Einschränkungen für das Attribut eines einzelnen Modells anzuwenden. Um dies zu erreichen, stellen Sie ein Array von Abfragefiltern anstelle eines einzelnen Filters bereit:
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
Es ist möglich, nach Attributen von Modellbeziehungen zu filtern – Eloquents whereHas()
wird angewendet. Um nach Relation zu filtern, fügen Sie das Relationsattribut in der Form relation:attribute
zur Liste der searchable
Felder hinzu. In der Abfrage sollte dieselbe Zeichenfolge verwendet werden, um nach dem Attribut dieser Beziehung zu filtern, z. B.:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
Es ist auch möglich, die Such- und Filterobjekte zu negieren, die keine passende Beziehung haben, indem Sie whereDoesntHave()
von Eloquent anwenden. Um dies zu tun, stellen Sie dem Beziehungsnamen !
voran. :
// allow filtering on comment's approved field
protected $searchable = ['comments:approved'];
// filter only posts that have approved comments
?comments:approved=1
// filter only posts that have not-approved comments
?comments:approved=1
// filter only posts that do not have approved comments
?!comments:approved=1
Wenn Sie nach einer verschachtelten Beziehung filtern möchten, geben Sie einfach den Namen der verschachtelten Beziehung ein, wobei der Punkt durch einen Doppelpunkt ersetzt wird. Dies ist notwendig, da PHP Punkte in der URL automatisch durch Unterstriche ersetzt.
// filter only posts that have comments from active authors
?comments:author:active=1
Es ist möglich, ausgewählte Filter mit Ihrer eigenen Logik zu verarbeiten, z. B. wenn der Filtername nicht mit dem Namen des zum Filtern verwendeten Attributs übereinstimmt oder einige benutzerdefinierte Vorgänge ausgeführt werden müssen. Um die Logik für den Filter xyz
zu überschreiben, müssen Sie in Ihrem Modell eine Methode namens processXyzFilter
definieren. Diese Methode sollte true
zurückgeben, wenn der Filter verarbeitet wurde und die Standardlogik nicht mehr auftreten sollte.
// use one filter to search in multiple columns
protected function processNameFilter ( Builder $ builder , Constraint $ constraint )
{
// this logic should happen for LIKE/EQUAL operators only
if ( $ constraint -> getOperator () === Constraint :: OPERATOR_LIKE || $ constraint -> getOperator () === Constraint :: OPERATOR_EQUAL ) {
$ builder -> where ( function ( $ query ) use ( $ constraint ) {
$ query -> where ( ' first_name ' , $ constraint -> getOperator (), $ constraint -> getValue ())
-> orWhere ( ' last_name ' , $ constraint -> getOperator (), $ constraint -> getValue ());
});
return true ;
}
// default logic should be executed otherwise
return false ;
}
Um einen Filter für die Beziehungssuche zu überschreiben, ersetzen Sie den Doppelpunkt im Filternamen durch einen Unterstrich. Wenn Sie die Logik für user:active
überschreiben möchten, müssen Sie die Methode processUser_ActiveFilter
definieren.