Eine nützliche Bibliothek zum Erstellen von Filtern für Eloquent.
Diese Bibliothek ist nützlich, um mithilfe von Eloquent Suchfilter in Ihrer Rest-API zu erstellen.
??
Mit der Eloquent Filter-Bibliothek können Sie Muster für Suchkriterien für Modelle in Ihrem Laravel-Projekt erstellen. Die Idee besteht darin, dass Aggregatfilter einfach die Werte in Ihrer Anforderungsnutzlast weitergeben.
Für die Installation sollten Sie Composer verwenden. Führen Sie den folgenden Befehl aus:
composer require laravellegends/eloquent-filter
Das Merkmal LaravelLegendsEloquentFilterConcernsHasFilter
kann in Modellen verwendet werden, die die Suchfilter anwenden.
use LaravelLegends EloquentFilter Concerns HasFilter ;
class User extends Model
{
use HasFilter ;
}
Das HasFilter
-Merkmal stellt die filter
und withFilter
-Methoden bereit.
Eine einfache Möglichkeit, diese Bibliothek in Ihrer Laravel-Anwendung zu verwenden, besteht darin, die filter
aufzurufen, bevor Sie Ergebnisse Ihres Modells erhalten.
Beispiel:
class UsersController extends Controller
{
use App Models User ;
public function index ()
{
return User :: filter ()-> paginate ();
}
// or
public function index ()
{
return User :: latest ( ' id ' )-> filter ()-> paginate ();
}
// or
public function index ( Request $ request )
{
return User :: filter ( $ request )-> paginate ();
}
}
Sie können die Ergebnisse anzeigen, wenn Sie /api/users?exact[id]=1
aufrufen. Die SQL-Abfrage "select * from users where (id = 1)"
wird angewendet.
Hinweis: Zeigen Sie die Regelsitzung an, um weitere Informationen zu erhalten.
Eine andere Möglichkeit besteht darin, den spezifischen Filter für ein Modell zu verwenden. Sie können die ModelFilter-Klasse erben, um einen benutzerdefinierten Filter für ein Modell zu erstellen.
Um diese Klasse zu erstellen, sollten Sie den Befehl php artisan make:filter
verwenden, wie im folgenden Beispiel:
$ php artisan make:filter UserFilter
Der obige Befehl generiert die folgende Klasse:
namespace App Filters ;
use LaravelLegends EloquentFilter Filters ModelFilter ;
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' role_id ' => ' not_equal ' , // or ['not_equal']
' name ' => [ ' contains ' , ' starts_with ' ],
];
}
}
Im Controller
use App Models User ;
use Illuminate Http Request ;
use LaravelLegends EloquentFilter Filter ;
class UsersController extends Controller
{
// api/users?starts_with[name]=Wallace¬_equal[role_id]=2
public function index ( Request $ request )
{
return User :: withFilter ( new UserFilter , $ request )
-> orderBy ( ' name ' )
-> get ();
}
}
Der obige Code wird intern wie folgt aufgerufen:
User :: where ( function ( $ query ) {
$ query -> where ( ' name ' , ' LIKE ' , ' Wallace% ' );
$ query -> where ( ' role_id ' , ' <> ' , ' 2 ' );
})
-> orderBy ( ' name ' )
-> get ();
Diese Bibliothek wendet intern Filter basierend auf Abfragezeichenfolgenparametern mit speziellen Schlüsselwerksnamen an.
Alle Parameter sehen Sie hier:
Der Maximalwert einer Spalte. Die URL api/users?max[field]=100
ist wie ein User::where('field', '<=', 100)
.
Der Mindestwert einer Spalte. Die URL api/users?min[age]=33
ist wie ein User::where('age', '>=', 33)
.
Ein in einer Spalte enthaltener Suchbegriff. Die URL api/users?contains[name]=wallace
ist wie ein User::where('name', 'LIKE', '%wallace%')
.
Suchen Sie einen Wert entsprechend dem Endinhalt der Zeichenfolge. Ähnelt einem LIKE
mit %$value
Wert.
Filtern Sie das Feld, wenn der Wert mit einem bestimmten Wert beginnt. Eine URL api/users?starts_with[name]=brcontainer
klingt wie ein User::where('name', 'LIKE', 'brcontainer%')
.
Suche nach einem genauen Wert des Feldes· Eine URL api/users?exact[email][email protected]
Klingt wie ein User::where('name', '=', '[email protected]')
.
Nach Beziehung filtern. Sie können den Wert 0
oder 1
verwenden.
Beispiel:
Die URL api/users?has[posts]=1
ist wie ein User::has('posts')
Die URL api/users?has[posts]=0
ist wie ein User::doesntHave('posts')
Wenden Sie WHERE IS NULL
oder WHERE IS NOT NULL
auf eine Abfrage an.
Beispiel:
Die URL api/users?is_null[cpf]=1
ist wie ein User::whereNull('cpf')
Die URL api/users?is_null[age]=0
ist wie ein User::whereNotNull('age')
Sucht, wenn eine Spalte NICHT die übergebenen Werte hat.
Beispiel:
Die URL api/users?not_in[role][]=1¬_in[role][]=2
entspricht User::whereNotIn('role', [1, 2])
Hinweis : Wenn not_in[my_field]
ein leeres Array ist, wird keine Aktion ausgeführt.
Sucht, wenn eine Spalte die übergebenen Werte hat.
Beispiel:
Die URL api/users?in[role][]=10&in[role][]=20
klingt wie ein User::whereIn('role', [10, 20])
HINWEIS : Wenn in[my_field]
ein leeres Array ist, wird keine Aktion ausgeführt.
Suche nach einem Maximalwert eines Datumsfelds.
Eine URL api/users?date_max[created_at]=2021-01-01
klingt wie ein User::whereDate('created_at', '<=', '2021-01-01')
Suche nach einem Mindestwert eines Datumsfelds.
Beispiel:
Eine URL api/users?date_min[created_at]=2021-01-01
klingt wie ein User::whereDate('created_at', '>=', '2021-01-01')
Suche nach ungleichem Wert übergeben. Wenn Sie in einem zugehörigen Feld verwenden, wird „whereDoesntHave“ angewendet.
Beispiel:
Die URL api/users?not_equal[profile_id]=3
klingt wie eine
User :: where ( ' profile_id ' , ' <> ' , ' 3 ' );
Die URL api/users?not_equal[roles.id]=1
klingt wie eine
User :: whereDoesntHave ( ' roles ' , fn ( $ query ) => $ query -> where ( ' id ' , ' = ' , 3 ));
Die URL api/users?year_max[created_at]=2000
klingt wie eine
User :: whereYear ( ' created_at ' , ' <= ' , 2000 );
Die URL api/users?year_min[created_at]=1998
klingt wie eine
User :: whereYear ( ' created_at ' , ' >= ' , 1998 );
Die URL api/users?year_exact[created_at]=1998
klingt wie eine
User :: whereYear ( ' created_at ' , ' = ' , 1998 );
Sie können die Suchfilter in den in Ihrem Modell definierten Beziehungsmethoden anwenden.
Zum Beispiel:
Modell:
class User extends Model
{
use HasFilter ;
public function phones ()
{
return $ this -> hasMany ( Phone ::class, ' user_id ' );
}
}
Filter:
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' id ' => [ ' exact ' , ' not_equal ' ],
' created_at ' => [ ' year_exact ' , ' date_max ' , ' date_min ' ],
' phones.number ' => [ ' contains ' ],
// or
' phones ' => new PhoneFilter ,
];
}
}
class PhoneFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' number ' => ' contains '
];
}
}
class UserController extends Controller
{
public function index ()
{
// api/users?not_in[role_id][]=1¬_in[role_id][]=3
// select * from users where (role_id NOT IN (1, 3))
return User :: withFilter ( new UserFilter )-> paginate ();
}
// Or, apply filter as nested query
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where (role_id = 1)
return User :: where ( UserFilter :: toClosure ())-> paginate ();
}
// Or apply in your query as base condition
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where role_id = 1
return User :: tap ( UserFilter :: toClosure ())-> paginate ();
}
}
Im folgenden Beispiel wird der Benutzer nach dem zugehörigen Telefon gefiltert, das den Wert 55
enthält.
Die api/users?exact[phones.number]=55
lautet wie folgt:
User :: where ( function ( $ query ) {
$ query -> whereHas ( ' phones ' , function ( $ query ) {
$ query -> where ( ' number ' , ' = ' , ' 55 ' );
});
})-> paginate ();
Wenn Sie axios
-Bibliothek verwenden, können Sie die params
verwenden, um die oben genannten Filter einzuschließen.
Beispiel:
const api = axios . create ( {
baseURL : 'http://localhost:8000/api'
} ) ;
api . get ( 'users' , {
params : {
'in[role]' : [ 1 , 2 , 3 ] ,
'contains[name]' : 'Maxters' ,
'is_null[name]' : 0
}
} )