logo

基础

可搜索字段

要定义可搜索的资源字段,可将数据库列数组分配给资源类的 search 属性。该数组默认包含 id 列:

php
/**
 * 可以搜索的字段。
 *
 * @var array
 */
public static $search = [
    'id', 'title', 'content',
];

Scout 集成

如果使用 Nova 的 Scout 集成,$search 属性对搜索结果没有影响,可能会被忽略。你应该在 Algolia 或 Meilisearch 面板中管理可搜索字段。

全文索引

通常,Nova 会使用简单的 LIKE 子句搜索数据库字段。但是,如果你使用的是 MySQL 或 Postgres,你可以利用你定义的任何全文索引。为此,你应在 Nova 资源类上定义一个 searchableColumns 方法,而不是定义一个 $search 属性。

searchableColumns 方法应返回一个可搜索字段数组。你可以在此数组中包含一个 Laravel\Nova\Query\Search\SearchableText 的实例,以指示 Nova 在查询给定字段时使用你的全文索引:

php
use Laravel\Nova\Query\Search\SearchableText;

/**
 * 获取资源的可搜索字段。
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableText('title')];
}

搜索关联

Laravel Nova 还允许你对资源的相关模型进行搜索。例如, 想象一个 Post 模型通过 author 关系与 User 模型相关. 你可以通过从资源的 searchableColumns 方法返回一个 Laravel\Nova\Query\Search\SearchableRelation 实例来表示在搜索用户时应考虑此关联数据。

如果资源中不存在 searchableColumns 方法,则应定义该方法。一旦定义了 searchableColumns 方法,你就可以删除资源中的 $search 属性:

php
use Laravel\Nova\Query\Search\SearchableRelation;

/**
 * 获取资源的可搜索字段。
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableRelation('author', 'name')];
}

为方便起见,你可以使用「点符号」将字段添加到资源的 $search 属性中,从而定义应搜索的关联:

php
/**
 * 可以搜索的字段。
 *
 * @var array
 */
public static $search = [
    'id', 'author.name'
];

多态关联

通过从资源的 searchableColumns 方法返回 Laravel\Nova\Query\Search\SearchableMorphToRelation 实例,可以搜索「多态」关系。SearchableMorphToRelation 类允许你指定应该搜索哪些类型的多态关联模型:

php
use App\Nova\Post;
use Laravel\Nova\Query\Search\SearchableMorphToRelation;

/**
 * 获取资源的可搜索字段。
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableMorphToRelation('commentable', 'title', [Post::class])];
}

搜索 JSON 数据

如果与你的资源相关联的数据库表包含一个包含 JSON 字符串的列,你可以从资源的 searchableColumns 方法中返回一个 Laravel\Nova\Query\Search\SearchableJson 实例,指示 Nova 在 JSON 字符串中进行搜索。

如果资源中不存在 searchableColumns 方法,则应定义该方法。一旦定义了 searchableColumns 方法,你就可以删除资源中的 $search 属性:

php
use Laravel\Nova\Query\Search\SearchableJson;

/**
 * 获取资源的可搜索字段。
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableJson('meta->address->postcode')];
}