dkulyk / nova-dependent-filter
v1.0.0
2019-02-01 10:31 UTC
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2022-02-01 13:15:48 UTC
README
Nova Dependent Filter
安装
您可以通过 composer 在使用 Nova 的 Laravel 应用中安装此包。
composer require dkulyk/nova-dependent-filter
使用
声明
您可以直接在 filters 方法中声明过滤器
function filters(Request $request) { return [ (new DependentFilter('State')) ->withOptions([ 'all' => 'All orders', 'draft' => '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 = 'category_id'; 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') ->dpendentOf('state_id') ->withOptions(function (Request $request, $filters) { return City::where('state_id', $filters['state_id']) ->pluck('title', 'id'); }), ]; }
在类声明中,您还需要设置 $dpendentOf
属性
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); } }
您还可以通过 key
方法指定另一个过滤器键。
感谢
感谢 Brian 的支持和建议。