Nova 过滤器是简单的类,允许您使用自定义条件来限定 Nova 索引查询。
可过滤字段
在创建自己的过滤器之前,您可能需要查看 可过滤字段。可过滤字段可以解决大多数 Nova 安装的过滤需求,而无需编写自定义代码。
最常见的 Nova 过滤器类型是“选择”过滤器,它允许用户从下拉选择菜单中选择一个过滤器选项。
您可以使用 nova:filter
Artisan 命令生成选择过滤器。默认情况下,Nova 会将新生成的过滤器放置在 app/Nova/Filters
目录中。
php artisan nova:filter UserType
每个由 Nova 生成的选择过滤器包含两个方法:apply
和 options
。apply
方法负责修改底层 Eloquent 查询以实现所需的过滤器状态,而 options
方法定义了过滤器可能具有的“值”。让我们看一个 UserType
过滤器的示例。
<?php
namespace App\Nova\Filters;
use Laravel\Nova\Filters\Filter;
use Laravel\Nova\Http\Requests\NovaRequest;
class UserType extends Filter
{
/**
* Apply the filter to the given query.
*
* @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);
}
/**
* Get the filter's available options.
*
* @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 --boolean` Artisan 命令生成布尔过滤器。默认情况下,Nova 会将新生成的过滤器放置在 `app/Nova/Filters` 目录中。
php artisan nova:filter UserType --boolean
每个由 Nova 生成的布尔过滤器都包含两个方法:`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
{
/**
* Apply the filter to the given query.
*
* @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']);
}
/**
* Get the filter's available options.
*
* @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 --date
每个由 Nova 生成的日期过滤器都包含一个方法:`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
{
/**
* Apply the filter to the given query.
*
* @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` 属性。
/**
* The displayable name of the filter.
*
* @var string
*/
public $name = 'Filter Title';
如果您的过滤器的名称需要是动态的,您应该在过滤器类上创建一个 `name` 方法。
/**
* Get the displayable name of the filter.
*
* @return string
*/
public function name()
{
return 'Filter By '.$this->customProperty;
}
如果您想设置过滤器的默认值,可以在过滤器类上定义一个default
方法
/**
* The default value of the filter.
*
* @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
{
/**
* The column that should be filtered on.
*
* @var string
*/
protected $column;
/**
* Create a new filter instance.
*
* @param string $column
* @return void
*/
public function __construct($column)
{
$this->column = $column;
}
/**
* Apply the filter to the given query.
*
* @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));
}
/**
* Get the key for the filter.
*
* @return string
*/
public function key()
{
return 'timestamp_'.$this->column;
}
}
然后,正如所讨论的,您应该传递您希望过滤的列的名称
/**
* Get the filters available for the resource.
*
* @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'),
];
}