bourne / dependent-filter
Laravel Nova 的依赖过滤器
1.1
2021-03-06 07:27 UTC
Requires
- php: >=7.1.0
This package is auto-updated.
Last update: 2024-09-14 21:36:13 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 提供的支持和建议。