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.
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 selectionsuse Laravilt\QueryBuilder\Filters\DateFilter;
DateFilter::make('created_at')
->label('Created Date')
->between(); // Date range filteruse 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 testcomposer formatcomposer analyseThe MIT License (MIT). Please see License File for more information.
