Added

FilterType Enum

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]);

Required Filters

Filters can be marked as required.

Filter::field('name', [FilterType::LIKE])->required();

Pivot Filters

Pivot filter support for BelongsToMany and MorphToMany relationships.

Filter::field('tagged_by', [FilterType::EQUAL])->pivot(Post::class);

Morph Filters

FilterType::HAS_MORPH
FilterType::DOESNT_HAS_MORPH
Filter::morphRelation(
    'subscribable',
    [FilterType::HAS_MORPH],
)->includeRelationFields([
    FoodDeliveryService::class,
    Sass::class,
])

Validation Rules

Validation rules, messages, and attributes can be defined on a per FilterType basis.

Filter::field('status', [
    FilterType::IN->withValidation([
        'value.*' => [Rule::enum(OrderStatus::class)]
    ])
]),

Filter Modifiers

$like:start

$like:end

$notLike:start

$notLike:end

$in:null

$notIn:null

Exceptions

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.

Changed

Qualifying Columns

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 Structure

Custom filters no longer should extend abstract classes.

See custom filters for how custom filter classes should now be structured.

Removed

Filters

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()

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.

Types::except()

Removed due to un-needed complexity.

Config

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.