logo

定义过滤器

Nova 过滤器是简单的类,允许您使用自定义条件来限定 Nova 索引查询。

可过滤字段

在创建自己的过滤器之前,您可能需要查看 可过滤字段。可过滤字段可以解决大多数 Nova 安装的过滤需求,而无需编写自定义代码。

选择过滤器

最常见的 Nova 过滤器类型是“选择”过滤器,它允许用户从下拉选择菜单中选择一个过滤器选项。

Filters

您可以使用 nova:filter Artisan 命令生成选择过滤器。默认情况下,Nova 会将新生成的过滤器放置在 app/Nova/Filters 目录中。

bash
php artisan nova:filter UserType

每个由 Nova 生成的选择过滤器包含两个方法:applyoptionsapply 方法负责修改底层 Eloquent 查询以实现所需的过滤器状态,而 options 方法定义了过滤器可能具有的“值”。让我们看一个 UserType 过滤器的示例。

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

如您在上面的示例中看到的,您可以利用传入的 $value 来修改您的查询,并且 apply 方法应该返回修改后的查询实例。

布尔过滤器

Nova 还支持“布尔”过滤器,它允许用户通过一组复选框选择多个过滤器选项。

Boolean Filter

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

bash
php artisan nova:filter UserType --boolean

每个由 Nova 生成的布尔过滤器都包含两个方法:`apply` 和 `options`。`apply` 方法负责修改 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
{
    /**
     * 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 还支持“日期”过滤器,允许用户通过日期选择日历选择过滤器的值。

Date Filter

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

bash
php artisan nova:filter BirthdayFilter --date

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

在构建日期过滤器时,传递给 `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
{
    /**
     * 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` 属性。

php
/**
 * The displayable name of the filter.
 *
 * @var string
 */
public $name = 'Filter Title';

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

php
/**
 * Get the displayable name of the filter.
 *
 * @return string
 */
public function name()
{
    return 'Filter By '.$this->customProperty;
}

过滤器默认值

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

php
/**
 * The default value of the filter.
 *
 * @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
{
    /**
     * 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;
    }
}

然后,正如所讨论的,您应该传递您希望过滤的列的名称

php
/**
 * 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'),
    ];
}