jeffersonsimaogoncalves/dependent-filter

Laravel Nova 的依赖筛选器

v2.1.0 2022-11-22 16:54 UTC

This package is auto-updated.

Last update: 2024-09-17 10:43:17 UTC


README

Latest Version on Github Total Downloads Become a Patron!

此软件包提供了依赖于其他筛选器的筛选器。

  1. 安装
  2. 使用
    1. 声明
    2. 类声明
    3. 静态依赖
    4. 动态依赖
    5. 隐藏空筛选器
    6. 默认筛选器值
    7. 其他内容
  3. 感谢

安装

您可以通过 composer 将此软件包安装到使用 Nova 的 Laravel 应用程序中

composer require jeffersonsimaogoncalves/dependent-filter

使用

声明

您可以直接在筛选器方法中声明筛选器

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

此外,您还可以使用 DependentFilter::make() 代替 new DependentFilter()

对于查询,您需要使用回调声明

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

注意:与 Nova 筛选器不同,筛选器的 value 需要作为数组键传递,而 label 作为数组值。

类声明

与 Nova 筛选器一样,您可以创建筛选器类

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');
    } 
}

注意:与声明选项的回调相同,fresh 方法是相同的。

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

静态依赖

对于创建依赖筛选器,您需要指定在哪个依赖筛选器值下将显示选项

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

注意:您必须指定筛选器的键,而不是属性或类名。

动态依赖

对于大量数据集合,您可以使用动态更新筛选器。

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');
            }),
    ];
}

在类声明中,您还需要设置 $dependentOf 属性

class CityFilter extends DependentFilter
{
    public $dependentOf = ['state_id'];
    
    function options(Request $request, $filters = [])
    {
        return City::where('state_id', $filters['state_id'])
            ->pluck('title', 'id');
    }
}

如果您只想在主筛选器被选中时显示选项,可以使用 when 进行检查

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

隐藏空筛选器

您可以将筛选器隐藏,直到它们有选项。

为此,您需要设置 $hideWhenEmpty 或调用 hideWhenEmpty() 方法

class CityFilter extends DependentFilter
{
    public $hideWhenEmpty = true;
    
}
function filters(Request $request) {
    return [
        StateFilter::make('State', 'state_id'),
        
        CityFilter::make('City', 'city_id')->hideWhenEmpty(),
    ];
}

默认筛选器值

如果您想设置默认值,需要调用 withDefault 方法并传递值,或者在类声明中重载 default 方法。

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

其他内容

默认情况下,筛选器通过在 $attribute 中指定的字段与筛选器值进行比较进行检查。您可以像在 Nova 筛选器中一样重载它

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

当您使用声明样式时,可以将应用回调传递给 withApply 方法

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

您还可以通过方法 key 指定另一个筛选器键。

感谢

感谢 Brian 提供的支持和建议。

https://github.com/awesome-nova/dependent-filter/