bourne/dependent-filter

Laravel Nova 的依赖过滤器

1.1 2021-03-06 07:27 UTC

This package is auto-updated.

Last update: 2024-09-14 21:36:13 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 awesome-nova/dependent-filter

使用

声明

您可以直接在 filters 方法中声明过滤器

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 提供的支持和建议。