laravilt / query-builder
Complete query builder system with filters, sorting, search, and pagination. Build powerful, filterable data queries with support for multiple filter types, custom sorts, full-text search, and seamless Inertia.js integration.
Fund package maintenance!
fadymondy
Installs: 40
Dependents: 3
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/laravilt/query-builder
Requires
- php: ^8.3|^8.4
- illuminate/database: ^12.0
- illuminate/support: ^12.0
- laravilt/support: ^v1.0
- spatie/laravel-package-tools: ^1.14
Requires (Dev)
- larastan/larastan: ^2.9||^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-arch: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- pestphp/pest-plugin-livewire: ^3.0
- pestphp/pest-plugin-type-coverage: ^3.5
- phpstan/extension-installer: ^1.3||^2.0
- phpstan/phpstan-deprecation-rules: ^1.1||^2.0
- phpstan/phpstan-phpunit: ^1.3||^2.0
This package is auto-updated.
Last update: 2025-12-02 13:11:18 UTC
README
Laravilt Query Builder
Complete query builder system with filters, sorting, search, and pagination for Laravilt. Build powerful, filterable data queries with support for multiple filter types, custom sorts, full-text search, and seamless Inertia.js integration.
Features
- 🔍 Advanced Filtering - Multiple filter types (select, date, range, boolean)
- ↕️ Sorting - Custom sort options with direction control
- 🔎 Search - Full-text search across multiple columns
- 📄 Pagination - Built-in pagination support
- ⚡ Inertia Integration - Seamless Vue 3 integration
- 🎯 Eloquent Compatible - Works with Laravel's query builder
- 🔧 Customizable - Extensible filters and sorts
Installation
composer require laravilt/query-builder
The package will automatically register its service provider.
Quick Start
use Laravilt\QueryBuilder\QueryBuilder; use Laravilt\QueryBuilder\Filters\SelectFilter; use Laravilt\QueryBuilder\Filters\DateFilter; use Laravilt\QueryBuilder\Sort; $queryBuilder = new QueryBuilder(); $queryBuilder ->filters([ SelectFilter::make('status') ->options([ 'active' => 'Active', 'inactive' => 'Inactive', ]), DateFilter::make('created_at') ->label('Created Date'), ]) ->sorts([ Sort::make('name')->label('Name'), Sort::make('created_at')->label('Date'), ]) ->search('search query') ->sortBy('created_at', 'desc') ->perPage(25) ->apply(User::query()) ->paginate();
Filter Types
Select Filter
use Laravilt\QueryBuilder\Filters\SelectFilter; SelectFilter::make('status') ->label('Status') ->options([ 'active' => 'Active', 'inactive' => 'Inactive', 'pending' => 'Pending', ]) ->multiple(); // Allow multiple selections
Date Filter
use Laravilt\QueryBuilder\Filters\DateFilter; DateFilter::make('created_at') ->label('Created Date') ->between(); // Date range filter
Range Filter
use Laravilt\QueryBuilder\Filters\RangeFilter; RangeFilter::make('price') ->label('Price Range') ->min(0) ->max(1000);
Boolean Filter
use Laravilt\QueryBuilder\Filters\BooleanFilter; BooleanFilter::make('is_active') ->label('Active Only');
Sorting
use Laravilt\QueryBuilder\Sort; Sort::make('name') ->label('Name') ->default(); // Set as default sort Sort::make('created_at') ->label('Date') ->desc(); // Default direction: desc
Search
$queryBuilder->search($request->get('search')); // Search across specific columns $queryBuilder->searchColumns(['name', 'email', 'phone']);
Pagination
// Enable pagination (default) $queryBuilder->paginated(); // Set per page $queryBuilder->perPage(25); // Disable pagination $queryBuilder->paginated(false);
Applying to Eloquent Query
$query = User::query(); $queryBuilder ->filters([...]) ->apply($query) ->paginate();
Inertia Integration
use App\QueryBuilders\UserQueryBuilder; use Inertia\Inertia; public function index(Request $request) { $queryBuilder = new UserQueryBuilder(); $users = $queryBuilder ->fromRequest($request) ->apply(User::query()) ->paginate(); return Inertia::render('Users/Index', [ 'users' => $users, 'queryBuilder' => $queryBuilder->toInertiaProps(), ]); }
Vue 3 Component
<template> <div> <!-- Filters --> <QueryBuilderFilters :filters="queryBuilder.filters" @update="handleFilterUpdate" /> <!-- Search --> <SearchInput v-model="search" @search="handleSearch" /> <!-- Results --> <DataTable :data="users" /> <!-- Pagination --> <Pagination :data="users" /> </div> </template> <script setup> import { ref } from 'vue' import { router } from '@inertiajs/vue3' const props = defineProps({ users: Object, queryBuilder: Object }) const handleFilterUpdate = (filters) => { router.get('/users', { filters }, { preserveState: true }) } </script>
Configuration
Publish the config file:
php artisan vendor:publish --tag="laravilt-query-builder-config"
Assets
Publish the plugin assets:
php artisan vendor:publish --tag="laravilt-query-builder-assets"
Testing
composer test
Code Style
composer format
Static Analysis
composer analyse
License
The MIT License (MIT). Please see License File for more information.
