indexzer0/eloquent-filtering
Filter Laravel Eloquent models using simple arrays and request data—no custom query spaghetti. Define allowed filters on your models, support complex search, and keep queries readable, maintainable, and easy to extend for APIs and dashboards.
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?