indexzer0/eloquent-filtering
Define allowed filters on your Eloquent models and apply them from simple arrays or request data—no custom query logic. Supports complex, type-based filtering for APIs and dashboards on Laravel 10+ / PHP 8.2+.
All core filters provided by this package can be used via string or via new FilterType enum.
Filter::field('name', ['$like']);
Filter::field('name', [FilterType::LIKE]);
Filters can be marked as required.
Filter::field('name', [FilterType::LIKE])->required();
Pivot filter support for BelongsToMany and MorphToMany relationships.
Filter::field('tagged_by', [FilterType::EQUAL])->pivot(Post::class);
FilterType::HAS_MORPH
FilterType::DOESNT_HAS_MORPH
Filter::morphRelation(
'subscribable',
[FilterType::HAS_MORPH],
)->includeRelationFields([
FoodDeliveryService::class,
Saas::class,
])
Validation rules, messages, and attributes can be defined on a per FilterType basis.
Filter::field('status', [
FilterType::IN->withValidation([
'value.*' => [Rule::enum(OrderStatus::class)]
])
]),
$like:start <Icon icon="link" iconType="solid" />
$like:end <Icon icon="link" iconType="solid" />
$notLike:start <Icon icon="link" iconType="solid" />
$notLike:end <Icon icon="link" iconType="solid" />
$in:null <Icon icon="link" iconType="solid" />
$notIn:null <Icon icon="link" iconType="solid" />
New exceptions for new features.
class InvalidFiltersPayloadException extends InvalidArgumentException
// When filters are passed to ::filter() that are not list arrays.
class InvalidModelFqcnException extends InvalidArgumentException
// When an invalid model string is passed to `Filter::morphType()` or `Filter::morphRelation()->includeRelationFields()`.
class UnsupportedModifierException extends InvalidArgumentException
// When an invalid modifier is passed to ->withModifiers().
class RequiredFilterException extends ValidationException
// When required filter(s) were not applied.
By default, columns are now qualified with database table when using Filter::field() with any of the core filters provided by this package.
Custom filters no longer should extend abstract classes.
Some dedicated filter classes were removed in favour of new modifiers feature.
$like:start.$like:end.$notLike:start.$notLike:end.allowedFilters() definitions should be updated.
public function allowedFilters(): AllowedFilterList
{
return Filter::only(
// old
// Filter::field('name', ['$notLike:end']),
// new (start & end modifiers enabled)
Filter::field('name', [FilterType::NOT_LIKE]),
// new (just end modifier enabled)
Filter::field('name', [FilterType::NOT_LIKE->withModifiers('end')]),
);
}
Filter::all() has been removed due to not being able to support pivot filters feature.
Target::relationAlias() has been removed due to Filter::all() being removed.
Removed due to un-needed complexity.
default_allowed_filter_list has been removed from the config file due to Filter::all() being removed.
All Filterable models default to no filters allowed.
How can I help you explore Laravel packages today?