arielespinoza07 / laravel-query-kit
A Laravel toolkit to handle for handling queries via a criteria pattern.
v1.0.1
2025-09-06 04:36 UTC
Requires
- php: ^8.2
- illuminate/console: ^11.0|^12.0
- illuminate/contracts: ^11.0|^12.0
- illuminate/database: ^11.0|^12.0
- illuminate/http: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
Requires (Dev)
- larastan/larastan: ^3.6.0
- laravel/pint: ^1.24.0
- mockery/mockery: ^1.6
- orchestra/testbench: ^9.14.0|^10.4.0
- pestphp/pest: ^3.8.2
- pestphp/pest-plugin-laravel: ^3.2
README
Laravel Query Kit is a powerful criteria-based query builder toolkit. It's built with SOLID principles and easy to extend.
๐งฑ Requirements
- PHP ^8.2
- Laravel ^11.0|^12.0
๐ฆ Installation
composer require arielespinoza07/laravel-query-kit
โจ Features
- โ Typed criteria: filters, search, pagination, sorting, soft deletes, and dates
- ๐ฏ Filter groups with operators (
=
,like
,between
,in
,not in
, etc.) andAND
/OR
logic - ๐ Sorts for relationships (
belongsTo
,hasOne
,hasMany
, etc.), with dedicated handlers - โก Central Facade/Service for composing and executing (builder, collection, pagination, resources)
- ๐ก๏ธ Input pre-validation (avoids invalid queries before touching the database)
- ๐งฉ Extensible architecture through interfaces (add your own criteria for filter or sort)
๐ Directory Structure
โโโ src/
| โโโ Console/
| | โโโ Commands/
| | โโโ stubs/
| โโโ Contracts/
| โโโ Criteria/
| | โโโ Sort/
| โโโ Exceptions/
| โโโ Handlers/
| โโโ Providers/
| โโโ Service/
| โโโ Support/
| | โโโ Facades/
| โโโ ValueObjects/
โโโ tests/
๐ Quickstart
use App\Models\User; use LaravelQueryKit\Criteria\WhereFieldCriteria; use LaravelQueryKit\Criteria\SortCriteria; use LaravelQueryKit\Support\Facades\QueryKitBuilder; $query = QueryKitBuilder::for(new User) ->withCriteria( new WhereFieldCriteria('email', 'like', '%john.doe%'), new SortCriteria('created_at', 'desc')->withDefaultSorts() );
- Get the builder
/** @var \Illuminate\Contracts\Database\Query\Builder $builder */ $builder = $query->builder();
- Get the model
/** @var \Illuminate\Database\Eloquent\Model|null $response */ $response = $query->toModel();
- Execute and get the response as a collection
/** @var \Illuminate\Support\Collection $response */ $response = $query->toCollection();
- Execute and get the response paginated
/** @var \Illuminate\Pagination\LengthAwarePaginator $response */ $response = $query->withPagination(page: 1, perPage: 10) ->toPaginated();
- Execute and get the response as a resource (single model)
use App\Http\Resources\UserResource; /** @var \Illuminate\Http\Resources\JsonResource $response */ $response = $query->toJsonResource(UserResource::class);
- Execute and get the response as a resource (collection)
use App\Http\Resources\UserCollection; /** @var \Illuminate\Http\Resources\Json\ResourceCollection $response */ $response = $query->toResourceCollection(UserCollection::class);
- Execute and get the response as a resource (collection paginated)
use App\Http\Resources\UserCollection; /** @var \Illuminate\Http\Resources\Json\ResourceCollection $response */ $response = $query->withPagination(page: 1, perPage: 10) ->toResourceCollection(UserCollection::class);
๐ Methods & Handlers
Method | Handler |
---|---|
toModel() |
ModelHandler |
toCollection() |
CollectionHandler |
toPaginated() |
PaginatedHandler |
toJsonResource() |
JsonResourceHandler |
toResourceCollection() |
ResourceCollectionHandler |
Artisan Generators
- Create a new criteria class
WeekOrdersCriteria
php artisan make:criteria WeekOrders
<?php declare(strict_types=1); namespace App\Criteria\Billing; use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Support\Carbon; use LaravelQueryKit\Contracts\CriteriaInterface; final readonly class WeekOrdersCriteria implements CriteriaInterface { private Carbon $date; public function __construct( private string $column = 'created_at', private string $boolean = 'and', ?string $date = null, ) { $this->date = isset($date) ? Carbon::parse($date) : now(); } public function apply(Builder $builder): Builder { $weekDays = [ $this->date->startOfWeek()->format('Y-m-d H:i:s'), $this->date->endOfWeek()->format('Y-m-d H:i:s'), ]; return $builder->whereBetween( column: $this->column, values: $weekDays, boolean: $this->boolean, ); } }
- Create a new custom sort criteria, using a relationship
MonthBillingOrderByCriteria
php artisan make:criteria Sort/MonthBilling -s
<?php declare(strict_types=1); namespace App\Criteria\Sort; use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\Relation; use LaravelQueryKit\Contracts\SortCriteriaInterface; final readonly class MonthBillingOrderByCriteria implements SortCriteriaInterface { public function __construct() {} /** * {@inheritDoc} */ public function apply(Builder $builder, Model $model, Relation $relation, string $column, string $direction): Builder { // TODO: Implement apply() method. return $builder; } /** * {@inheritDoc} */ public function supports(Relation $relation): bool { // TODO: Implement supports() method. return true; } }
๐งช Testing
composer test
๐ค Contributing
See CONTRIBUTING for details.
Changelog
See CHANGELOG for details.
Security
Report vulnerabilities by email or private issues.