Nova 过滤器是一种简单的类,可让你使用自定义条件对 Nova 索引查询进行范围设置。
可过滤搜索筛选字段
在创建自己的过滤器之前,你可能需要查看 可筛选字段。可筛选字段能满足大多数 Nova 的过滤需求,而无需编写自定义代码。
Nova 过滤器最常见的类型是 "select" 过滤器,它允许用户从下拉选择菜单中选择过滤器选项:

你可以通过 nova:filter Artisan 命令来生成一个过滤器,生成的过滤器默认放在 app/Nova/Filters 文件夹下:
php artisan nova:filter UserType每个在 Nova 中生成的过滤器都包含了 2 个方法 : apply 和 options。apply方法负责按你希望的状态修改查询条件,而 options 方法用来定义过滤器中你要定义的过滤选项。举个例子,UserType 过滤器内容如下 :
<?php
namespace App\Nova\Filters;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
class UserType extends Filter
{
/**
* 将过滤器应用于给定的查询。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(NovaRequest $request, $query, $value)
{
return $query->where('type', $value);
}
/**
* 获取过滤器的可用选项。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function options(NovaRequest $request)
{
return [
'Administrator' => 'admin',
'Editor' => 'editor',
];
}
}options 方法返回一个键值对数组。数组的键是展示给使用者选择的文本。数组的值则会在选择后作为 $value 参数传入 apply 方法。在示例中,我们的过滤器定义了 2 个选项 : admin 和 editor。
如上例所示,你可以利用输入的 $value 来修改查询,而 apply 方法应返回修改后的查询实例。
Nova 还支持 "boolean" 过滤器,允许用户通过复选框列表选择多个过滤器选项:

你可以使用 nova:filter --boolean Artisan 命令生成布尔过滤器。默认情况下,Nova 会将新生成的过滤器放在 app/Nova/Filters 目录中:
php artisan nova:filter UserType --booleanNova 生成的每个布尔过滤器都包含两个方法:apply 和 options。apply 方法负责修改 Eloquent 查询以实现所需的过滤器状态,而 options 方法则定义过滤器可能具有的 "值"。
在构建布尔过滤器时,传递给 apply 方法的 $value 参数是一个关联数组,其中包含过滤器每个选项的布尔值。让我们来看一个 UserType 过滤器的示例:
<?php
namespace App\Nova\Filters;
use Laravel\Nova\Filters\BooleanFilter;
use Laravel\Nova\Http\Requests\NovaRequest;
class UserType extends BooleanFilter
{
/**
* 将过滤器应用于给定的查询。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(NovaRequest $request, $query, $value)
{
// $value = ['admin' => true / false, 'editor' => true / false]
return $query->where('is_admin', $value['admin'])
->where('is_editor', $value['editor']);
}
/**
* 获取过滤器的可用选项。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function options(NovaRequest $request)
{
return [
'Administrator' => 'admin',
'Editor' => 'editor',
];
}
}options 方法应返回一个包含键和值的数组。数组的键将用作 Nova UI 中显示的 "人性化" 文本。数组的值将作为 $value 参数传递给 apply 方法。此过滤器定义了两种可能的值:admin 和 editor。
如上例所示,你可以利用输入的 $value 来修改查询。apply 方法应返回修改后的查询实例。
Nova 还支持 "日期" 过滤器,允许用户通过日期选择日历来选择过滤器的值:

你可以使用 nova:filter --date Artisan 命令生成日期过滤器。默认情况下,Nova 会将新生成的过滤器放在 app/Nova/Filters 目录中:
php artisan nova:filter BirthdayFilter --dateNova 生成的每个日期过滤器都包含一个方法:apply。apply 方法负责修改查询,以实现所需的过滤器状态。
在构建日期筛选器时,传递给 apply 方法的 $value 参数是所选日期的字符串表示。让我们来看一个 BirthdayFilter 过滤器的示例:
<?php
namespace App\Nova\Filters;
use Illuminate\Support\Carbon;
use Laravel\Nova\Filters\DateFilter;
use Laravel\Nova\Http\Requests\NovaRequest;
class BirthdayFilter extends DateFilter
{
/**
* 将过滤器应用于给定的查询。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(NovaRequest $request, $query, $value)
{
return $query->where('birthday', '<=', Carbon::parse($value));
}
}如上例所示,你可以利用输入的 $value 来修改查询。apply 方法应返回修改后的查询实例。
如果你想更改显示在 Nova 过滤器选择菜单中的过滤器标题,可以在过滤器类上定义一个 name 属性:
/**
* 过滤器的可显示名称。
*
* @var string
*/
public $name = 'Filter Title';如果过滤器的名称需要是动态的,则应在过滤器类上创建一个 name 方法:
/**
* 获取过滤器的可显示名称。
*
* @return string
*/
public function name()
{
return 'Filter By '.$this->customProperty;
}如果要设置过滤器的默认值,可以在过滤器类上定义一个 default 方法:
/**
* 过滤器的默认值。
*
* @var string
*/
public function default()
{
return true;
}有时,你可能需要创建一个动态过滤器,对运行时确定的字段进行过滤,这样你就可以在多个不同的资源和字段中重复使用一个过滤器类。
要做到这一点,你可以在过滤器的构造函数中传递可过滤字段的名称。除了在构造函数中传递要过滤的字段名外,我们还需要重载过滤器的 key 方法,以便在页面上存在多个过滤器实例时,Nova 可以唯一标识该过滤器实例。让我们来看一个 TimestampFilter 过滤器示例:
<?php
namespace App\Nova\Filters;
use Illuminate\Support\Carbon;
use Laravel\Nova\Filters\DateFilter;
use Laravel\Nova\Http\Requests\NovaRequest;
class TimestampFilter extends DateFilter
{
/**
* 应筛选的字段。
*
* @var string
*/
protected $column;
/**
* 创建一个新的筛选器实例。
*
* @param string $column
* @return void
*/
public function __construct($column)
{
$this->column = $column;
}
/**
* 将筛选器应用于给定的查询。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(NovaRequest $request, $query, $value)
{
return $query->where($this->column, '<=', Carbon::parse($value));
}
/**
* 获取过滤器的 key。
*
* @return string
*/
public function key()
{
return 'timestamp_'.$this->column;
}
}然后,如前所述,你应该输入您希望过滤的字段的名称:
/**
* 获取资源可用的筛选器。
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function filters(NovaRequest $request)
{
return [
new Filters\TimestampFilter('created_at'),
new Filters\TimestampFilter('deleted_at'),
];
}