spatie/laravel-query-builder
Build safe, flexible Eloquent queries from incoming API requests. Supports whitelisted filtering (partial/exact/scope/custom), sorting, includes, field selection, pagination, and grouped AND/OR filters—ideal for JSON:API-style endpoints with minimal boilerplate.
Sometimes values to filter for could include commas. You can change the delimiter used to split array values by setting the delimiter key in the query-builder config file.
// config/query-builder.php
return [
'delimiter' => '|',
];
With this configuration, a request like GET /api/endpoint?filter[voltage]=12,4V|4,7V|2,1V would be parsed as:
// filters: [ 'voltage' => [ '12,4V', '4,7V', '2,1V' ]]
Note that this applies to ALL values for filters, includes and sorts.
To disable splitting entirely for all parameters, set the global delimiter to an empty string:
// config/query-builder.php
return [
'delimiter' => '',
];
If you need only filter values to stay intact globally, you can disable filter delimiter splitting in config:
// config/query-builder.php
'filter_value_splitting_enabled' => false,
This only affects filter values. Includes, sorts, fields, and appends will continue using the configured global delimiter. The default value is true.
You can override the delimiter for a specific filter using the delimiter() method. This is useful when a filter value may contain the default delimiter character.
// GET /api/endpoint?filter[voltage]=12,4V|4,7V|2,1V&filter[name]=John,Jane
QueryBuilder::for(Model::class)
->allowedFilters(
AllowedFilter::exact('voltage')->delimiter('|'),
AllowedFilter::exact('name'), // still uses the default comma delimiter
)
->get();
To disable splitting entirely for a filter, set the delimiter to an empty string:
AllowedFilter::exact('external_id')->delimiter('')
How can I help you explore Laravel packages today?