adimeo-data-suite/filters
Laravel package providing a filter suite for building and applying query filters to data sets. Helps structure filter definitions and plug them into requests for consistent, reusable filtering in your application.
Installation
composer require adimeo-data-suite/filters
Requires adimeo-data-suite/commons (install via composer require adimeo-data-suite/commons).
First Use Case: Filtering Collections
use Adimeo\DataSuite\Filters\Filter;
use Adimeo\DataSuite\Filters\FilterCollection;
$collection = collect([1, 2, 3, 4, 5]);
$filter = new Filter('>', 3); // Greater than 3
$filtered = (new FilterCollection())->add($filter)->apply($collection);
// Returns: [4, 5]
Where to Look First
Filter, FilterCollection, Rule, RuleCollection.adimeo-data-suite/commons for shared utilities (e.g., DataObject).$filterCollection = (new FilterCollection())
->add(new Filter('!=', 'status', 'active')) // Exclude active
->add(new Filter('>', 'price', 100)); // Price > 100
$results = $filterCollection->apply($usersCollection);
$requestFilters = $request->input('filters', []);
$filterCollection = (new FilterCollection())
->fromArray($requestFilters); // Parses ['field>value', 'field!=value']
$filteredData = $filterCollection->apply($model->getQuery());
use Adimeo\DataSuite\Filters\Eloquent\QueryBuilder;
$query = User::query();
$filterCollection = (new FilterCollection())->fromArray($request->filters);
$queryBuilder = new QueryBuilder($filterCollection);
$queryBuilder->apply($query);
use Adimeo\DataSuite\Filters\Rule;
$customRule = new class implements Rule {
public function apply($value, $data): bool {
return str_contains($data['name'], $value);
}
};
$filterCollection->add(new Filter('contains', $customRule));
$filterCollection->setCacheKey('user_filters_' . $request->user()->id);
$filtered = $filterCollection->apply($collection, 3600); // Cache for 1 hour
No Built-in Validation
fromArray). Validate/sanitize user-provided filters to avoid SQL injection or logic errors.$safeFilters = collect($request->filters)->map(fn($v) => htmlspecialchars($v));
Eloquent Integration Quirks
Eloquent\QueryBuilder assumes standard Laravel query methods (e.g., where, orWhere). Complex relationships may require custom rules.$filterCollection->add(new Filter('>', 'posts.published_at', now()->subDays(7)));
Performance with Large Datasets
Operator Limitations
LIKE, IN) are supported out-of-the-box. Extend Rule for custom logic.$filterCollection->debug(); // Dumps applied filters (if enabled in config).
$filterCollection->add($filter)->apply($collection); // Test each step.
Custom Operators
Filter::addOperator('startsWith', function ($value, $data) {
return str_starts_with($data, $value);
});
Usage:
$filter = new Filter('startsWith', 'prefix_');
Override Default Behavior
FilterCollection to add middleware:
class CachedFilterCollection extends FilterCollection {
public function apply($data, $ttl = null) {
return Cache::remember("filters_{$this->getCacheKey()}", $ttl, fn() => parent::apply($data));
}
}
Integrate with API Platform
fromArray method to parse OpenAPI filter definitions:
$filterCollection->fromArray($context['filters']);
How can I help you explore Laravel packages today?