composer require goodcat/laravel-eloquent-querystring
Laravel Eloquent Query String
Filtra i model Eloquent dai parametri della query string. Marca un metodo del model con un attributo PHP e verrà eseguito ogni volta che il suo parametro è nella richiesta.
In breve
Aggiungi il trait UseQueryString a un model e marca un metodo pubblico con l'attributo QueryString. L'attributo indica il parametro della query string a cui il metodo risponde:
use Goodcat\QueryString\Attributes\QueryString;
use Goodcat\QueryString\Traits\UseQueryString;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use UseQueryString;
#[QueryString('author')]
public function filterByAuthor(Builder $query, string $author): void
{
$query->whereRelation('author', 'username', $author);
}
#[QueryString('published')]
public function filterByPublished(Builder $query, string $published): void
{
if ($published === 'yes') {
$query->whereNotNull('published_at');
}
}
}
Poi applica i filtri della richiesta corrente con lo scope queryString():
Route::get('/posts', function (Request $request) {
return Post::query()->queryString($request)->paginate();
});
Ogni richiesta esegue solo i filtri che chiede:
/postsrestituisce tutti i post;/posts?author=matteorestituisce i post scritti damatteo;/posts?author=matteo&published=yesrestituisce solo quelli pubblicati.
I parametri senza un filtro corrispondente, come page, vengono ignorati.
Costruito su Eloquent
laravel-eloquent-querystring fa una cosa sola: chiama i tuoi metodi. Tutto il resto è l'Eloquent che conosci già:
- un filtro è un normale metodo che riceve il query builder, quindi può usare
where(), le relazioni, altri scope e tutto ciò che il builder supporta; - lo scope
queryString()funziona ovunque funzionino gli scope locali: suModel::query(), sulle relazioni e insieme agli altri vincoli della query; - i valori della richiesta passano prima dai middleware di Laravel, quindi le stringhe vuote sono già convertite in
nulle vengono saltate; - i filtri restano accanto alla logica di query del model, oppure in un oggetto filtro se preferisci una classe separata.
Non c'è nessuna configurazione da scrivere prima di iniziare: installa il package, marca un metodo, chiama lo scope.