PHPackages                             bourne/dependent-filter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. bourne/dependent-filter

ActiveLibrary[Search &amp; Filtering](/categories/search)

bourne/dependent-filter
=======================

Dependent filters for Laravel Nova

1.1(5y ago)042MITPHPPHP &gt;=7.1.0

Since Mar 6Pushed 5y ago1 watchersCompare

[ Source](https://github.com/bournewang/dependent-filter)[ Packagist](https://packagist.org/packages/bourne/dependent-filter)[ RSS](/packages/bourne-dependent-filter/feed)WikiDiscussions master Synced 4d ago

READMEChangelogDependenciesVersions (2)Used By (0)

Nova Dependent Filter
---------------------

[](#nova-dependent-filter)

[![Latest Version on Github](https://camo.githubusercontent.com/c6580fc8f721d945c3595f5b788657dd1e0f84a81fd433a359a66917dbe29dfe/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f617765736f6d652d6e6f76612f646570656e64656e742d66696c7465722e7376673f7374796c653d666c6174)](https://packagist.org/packages/awesome-nova/dependent-filter)[![Total Downloads](https://camo.githubusercontent.com/2895db40b48b52d533817d856024d29a635b5d585c7d2fec56f2514af67929d2/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f617765736f6d652d6e6f76612f646570656e64656e742d66696c7465722e7376673f7374796c653d666c6174)](https://packagist.org/packages/awesome-nova/dependent-filter)[![Become a Patron!](https://camo.githubusercontent.com/97222d0b261adeb712f6e28b2156c0c4333607c843ad33e3198d7f4dc6bdff28/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6265636f6d652d615f706174726f6e212d7265642e7376673f6c6f676f3d70617472656f6e267374796c653d666c6174)](https://www.patreon.com/bePatron?u=16285116)

This package provides filters what depends of another filters.

1. [Installation](#user-content-installation)
2. [Usage](#user-content-usage)
    1. [Declaration](#user-content-declaration)
    2. [Class declaration](#user-content-class-declaration)
    3. [Static dependencies](#user-content-static-dependencies)
    4. [Dynamic dependencies](#user-content-dynamic-dependencies)
    5. [Hiding empty filters](#user-content-hiding-empty-filters)
    6. [Default filter value](#user-content-default-filter-value)
    7. [Other stuffs](#user-content-other-stuffs)
3. [Thanks](#user-content-thanks)

Installation
------------

[](#installation)

You can install the package in to a Laravel app that uses [Nova](https://nova.laravel.com) via composer:

```
composer require awesome-nova/dependent-filter
```

Usage
-----

[](#usage)

### Declaration

[](#declaration)

You can declare filters in you filters method directly:

```
function filters(Request $request)
{
    return [
        (new DependentFilter('State'))
            ->withOptions([
                'all' => 'All orders',
                'dragt' => 'Draft',
                'outstanding' => 'Outstanding',
                'past_due' => 'Past due',
                'paid' => 'Paid',
            ]),
    ];
}
```

Also you can use `DependentFilter::make()` instead `new DependentFilter()`.

For queries you need to use callback declaration:

```
function filters(Request $request)
{
    return [
        DependentFilter::make('Category', 'category_id'))
            ->withOptions(function (Request $request) {
                return Category::pluck('title', 'id');
            }),
    ];
}
```

> Note: In difference with Nova filters filter's `value` need pass as array key and `label` as array value.

### Class declaration

[](#class-declaration)

As is Nova filters you can create filter's class:

```
class CategoryFilter extends DependentFilter
{
    /**
     * Name of filter.
     *
     * @var string
     */
    public $name = 'Category';

    /**
     * Attribute name of filter. Also it is key of filter.
     *
     * @var string
     */
    public $attribute = 'ctaegory_uid';

    public function options(Request $request, array $filters = [])
    {
        return Category::pluck('title', 'id');
    }
}
```

> Note: The `fresh` method is identical with the callback for declaring options.

```
function filters(Request $request)
{
    return [
        CategoryFilter::make(),
    ];
}
```

### Static dependencies

[](#static-dependencies)

For creating dependent filter you need to specify dependent filters values at which the option will be shown:

```
function filters(Request $request)
{
    return [
        CategoryFilter::make(),

        SubCategory::make('Subcategory', 'subcategory_id')
            ->withOptions(function (Request $request) {
                return SubCategory::all()->map(function ($subcategory) {
                    return [
                        'value' => $subcategory->id,
                        'label' => $subcategory->title.
                        'depends' => [
                            'category_id' => $subcategory->category_id, //Also you can set array of values
                        ],
                    ];
                });
            }),
    ];
}
```

> Note. Instead of an attribute or class name, you must specify the key of the filter.

### Dynamic dependencies

[](#dynamic-dependencies)

For big collection of data you can use dynamic updating of the filter.

```
function filters(Request $request)
{
    return [
        StateFilter::make('State', 'state_id'),

        DependentFilter::make('City', 'city_id')
            ->dependentOf('state_id')
            ->withOptions(function (Request $request, $filters) {
                return City::where('state_id', $filters['state_id'])
                    ->pluck('title', 'id');
            }),
    ];
}
```

In class declaration you also need to set `$dependentOf` property:

```
class CityFilter extends DependentFilter
{
    public $dependentOf = ['state_id'];

    function options(Request $request, $filters = [])
    {
        return City::where('state_id', $filters['state_id'])
            ->pluck('title', 'id');
    }
}
```

If you want to show options only when main filter is selected you can use `when` for check it:

```
function options(Request $request, $filters = []) {
    return City::when($filters['state_id'], function ($query, $value) {
        $query->where('state_id', $value)
    })->pluck('title', 'id');
}
```

### Hiding empty filters

[](#hiding-empty-filters)

You can hide filters until they have options.

For it you need set `$hideWhenEmpty` or call `hideWhenEmpty()` method:

```
class CityFilter extends DependentFilter
{
    public $hideWhenEmpty = true;

}
```

```
function filters(Request $request) {
    return [
        StateFilter::make('State', 'state_id'),

        CityFilter::make('City', 'city_id')->hideWhenEmpty(),
    ];
}
```

### Default filter value

[](#default-filter-value)

If you want to set default value you need to call `withDefault` method with value or overload `default` method in class declaration.

```
function filters(Request $request) {
    return [
        StateFilter::make('State', 'code')->withDefault('WA'),
    ];
}
```

```
class StateFilter extends DependentFilter
{
    public function default()
    {
        return 'WA';
    }
}
```

### Other stuffs

[](#other-stuffs)

By default filter checking by equal filed specified in `$attribute` and filter value. You can overload it like as in Nova filters:

```
class MyFilter extends DependentFilter
{
    public function apply(Request $request, $query, $value)
    {
        return $query->where('column', '>=', $value);
    }
}
```

When you use declare style you can set pass apply callback to `withApply` method:

```
function filters(Request $request) {
    return [
        StateFilter::make('State', 'code')->withApply(function ($request, $query, $value) {
            return $query->where('code', '=', $value);
        }),
    ];
}
```

Also you can specify another filter key over method `key`.

Thanks
------

[](#thanks)

Thanks to [Brian](https://github.com/dillingham) for his support and advices.

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1896d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/591f091bf0a103017bde3e42c13e0edd34e0420f8341404febaf4e739c359e18?d=identicon)[bournewang](/maintainers/bournewang)

---

Top Contributors

[![dkulyk](https://avatars.githubusercontent.com/u/370042?v=4)](https://github.com/dkulyk "dkulyk (8 commits)")

---

Tags

laravelfilternova

### Embed Badge

![Health badge](/badges/bourne-dependent-filter/health.svg)

```
[![Health](https://phpackages.com/badges/bourne-dependent-filter/health.svg)](https://phpackages.com/packages/bourne-dependent-filter)
```

###  Alternatives

[outl1ne/nova-detached-filters

This Laravel Nova package allows you to detach filters from the filter dropdown

64343.5k](/packages/outl1ne-nova-detached-filters)[outl1ne/nova-input-filter

An input filter for Laravel Nova

24822.7k](/packages/outl1ne-nova-input-filter)[suenerds/nova-searchable-belongs-to-filter

Searchable Nova filter for belongsTo relationships.

29516.9k](/packages/suenerds-nova-searchable-belongs-to-filter)[nrml-co/nova-big-filter

A nice looking filter menu thats always open.

35310.9k](/packages/nrml-co-nova-big-filter)[awesome-nova/dependent-filter

Dependent filters for Laravel Nova

26184.1k](/packages/awesome-nova-dependent-filter)[awesome-nova/filter-card

A Laravel Nova card.

25126.1k](/packages/awesome-nova-filter-card)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
