jeffersonsimaogoncalves / dependent-filter
Laravel Nova 的依赖筛选器
v2.1.0
2022-11-22 16:54 UTC
Requires
- php: ^8.0.2
- laravel/nova: ^4.0
This package is auto-updated.
Last update: 2024-09-17 10:43:17 UTC
README
此软件包提供了依赖于其他筛选器的筛选器。
安装
您可以通过 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 提供的支持和建议。