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.
- 🔍 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
composer require laravilt/query-builderThe package will automatically register its service provider.
useLaravilt\QueryBuilder\QueryBuilder;
useLaravilt\QueryBuilder\Filters\SelectFilter;
useLaravilt\QueryBuilder\Filters\DateFilter;
useLaravilt\QueryBuilder\Sort;
$queryBuilder = newQueryBuilder();
$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();useLaravilt\QueryBuilder\Filters\SelectFilter;
SelectFilter::make('status')
->label('Status')
->options([
'active' => 'Active',
'inactive' => 'Inactive',
'pending' => 'Pending',
])
->multiple(); // Allow multiple selectionsuseLaravilt\QueryBuilder\Filters\DateFilter;
DateFilter::make('created_at')
->label('Created Date')
->between(); // Date range filteruseLaravilt\QueryBuilder\Filters\RangeFilter;
RangeFilter::make('price')
->label('Price Range')
->min(0)
->max(1000);useLaravilt\QueryBuilder\Filters\BooleanFilter;
BooleanFilter::make('is_active')
->label('Active Only');useLaravilt\QueryBuilder\Sort;
Sort::make('name')
->label('Name')
->default(); // Set as default sort
Sort::make('created_at')
->label('Date')
->desc(); // Default direction: desc$queryBuilder->search($request->get('search'));
// Search across specific columns$queryBuilder->searchColumns(['name', 'email', 'phone']);// Enable pagination (default)$queryBuilder->paginated();
// Set per page$queryBuilder->perPage(25);
// Disable pagination$queryBuilder->paginated(false);$query = User::query();
$queryBuilder
->filters([...])
->apply($query)
->paginate();useApp\QueryBuilders\UserQueryBuilder;
useInertia\Inertia;
publicfunctionindex(Request$request)
{
$queryBuilder = newUserQueryBuilder();
$users = $queryBuilder
->fromRequest($request)
->apply(User::query())
->paginate();
return Inertia::render('Users/Index', [
'users' => $users,
'queryBuilder' => $queryBuilder->toInertiaProps(),
]);
}<template>
<div>
<!-- Filters -->
<QueryBuilderFilters
:filters="queryBuilder.filters"
@update="handleFilterUpdate"
/>
<!-- Search -->
<SearchInputv-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'constprops=defineProps({ users:Object, queryBuilder:Object})consthandleFilterUpdate= (filters) => {router.get('/users', { filters }, { preserveState:true })}</script>Publish the config file:
php artisan vendor:publish --tag="laravilt-query-builder-config"Publish the plugin assets:
php artisan vendor:publish --tag="laravilt-query-builder-assets"composer testcomposer formatcomposer analyseThe MIT License (MIT). Please see License File for more information.
