| Install | |
|---|---|
composer require laravilt/query-builder |
|
| Latest Version: | 1.0.1 |
| PHP: | ^8.3|^8.4 |

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.
composer require laravilt/query-builder
The package will automatically register its service provider.
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();
use Laravilt\QueryBuilder\Filters\SelectFilter;
SelectFilter::make('status')
->label('Status')
->options([
'active' => 'Active',
'inactive' => 'Inactive',
'pending' => 'Pending',
])
->multiple(); // Allow multiple selections
use Laravilt\QueryBuilder\Filters\DateFilter;
DateFilter::make('created_at')
->label('Created Date')
->between(); // Date range filter
use Laravilt\QueryBuilder\Filters\RangeFilter;
RangeFilter::make('price')
->label('Price Range')
->min(0)
->max(1000);
use Laravilt\QueryBuilder\Filters\BooleanFilter;
BooleanFilter::make('is_active')
->label('Active Only');
use Laravilt\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();
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(),
]);
}
<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>
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 test
composer format
composer analyse
The MIT License (MIT). Please see License File for more information.