logo

定义过滤器

Nova 过滤器是一种简单的类,可让你使用自定义条件对 Nova 索引查询进行范围设置。

可过滤搜索筛选字段

在创建自己的过滤器之前,你可能需要查看 可筛选字段。可筛选字段能满足大多数 Nova 的过滤需求,而无需编写自定义代码。

选择过滤器

Nova 过滤器最常见的类型是 "select" 过滤器,它允许用户从下拉选择菜单中选择过滤器选项:

Filters

你可以通过 nova:filter Artisan 命令来生成一个过滤器,生成的过滤器默认放在 app/Nova/Filters 文件夹下:

bash
php artisan nova:filter UserType

每个在 Nova 中生成的过滤器都包含了 2 个方法 : applyoptionsapply方法负责按你希望的状态修改查询条件,而 options 方法用来定义过滤器中你要定义的过滤选项。举个例子,UserType 过滤器内容如下 :

php
<?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 个选项 : admineditor

如上例所示,你可以利用输入的 $value 来修改查询,而 apply 方法应返回修改后的查询实例。

布尔过滤器

Nova 还支持 "boolean" 过滤器,允许用户通过复选框列表选择多个过滤器选项:

Boolean Filter

你可以使用 nova:filter --boolean Artisan 命令生成布尔过滤器。默认情况下,Nova 会将新生成的过滤器放在 app/Nova/Filters 目录中:

bash
php artisan nova:filter UserType --boolean

Nova 生成的每个布尔过滤器都包含两个方法:applyoptionsapply 方法负责修改 Eloquent 查询以实现所需的过滤器状态,而 options 方法则定义过滤器可能具有的 "值"。

在构建布尔过滤器时,传递给 apply 方法的 $value 参数是一个关联数组,其中包含过滤器每个选项的布尔值。让我们来看一个 UserType 过滤器的示例:

php
<?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 方法。此过滤器定义了两种可能的值:admineditor

如上例所示,你可以利用输入的 $value 来修改查询。apply 方法应返回修改后的查询实例。

日期过滤器

Nova 还支持 "日期" 过滤器,允许用户通过日期选择日历来选择过滤器的值:

Date Filter

你可以使用 nova:filter --date Artisan 命令生成日期过滤器。默认情况下,Nova 会将新生成的过滤器放在 app/Nova/Filters 目录中:

bash
php artisan nova:filter BirthdayFilter --date

Nova 生成的每个日期过滤器都包含一个方法:applyapply 方法负责修改查询,以实现所需的过滤器状态。

在构建日期筛选器时,传递给 apply 方法的 $value 参数是所选日期的字符串表示。让我们来看一个 BirthdayFilter 过滤器的示例:

php
<?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 属性:

php
/**
 * 过滤器的可显示名称。
 *
 * @var string
 */
public $name = 'Filter Title';

如果过滤器的名称需要是动态的,则应在过滤器类上创建一个 name 方法:

php
/**
 * 获取过滤器的可显示名称。
 *
 * @return string
 */
public function name()
{
    return 'Filter By '.$this->customProperty;
}

过滤器默认值

如果要设置过滤器的默认值,可以在过滤器类上定义一个 default 方法:

php
/**
 * 过滤器的默认值。
 *
 * @var string
 */
public function default()
{
    return true;
}

动态过滤器

有时,你可能需要创建一个动态过滤器,对运行时确定的字段进行过滤,这样你就可以在多个不同的资源和字段中重复使用一个过滤器类。

要做到这一点,你可以在过滤器的构造函数中传递可过滤字段的名称。除了在构造函数中传递要过滤的字段名外,我们还需要重载过滤器的 key 方法,以便在页面上存在多个过滤器实例时,Nova 可以唯一标识该过滤器实例。让我们来看一个 TimestampFilter 过滤器示例:

php
<?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;
    }
}

然后,如前所述,你应该输入您希望过滤的字段的名称:

php
/**
 * 获取资源可用的筛选器。
 *
 * @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'),
    ];
}