awesome-nova / dependent-filter
Laravel Nova 的依赖过滤
v1.1.2
2020-03-06 14:05 UTC
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2024-09-07 00:22:31 UTC
README
本包提供依赖于其他过滤器的过滤器。
安装
您可以通过 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 的支持和建议。