logo

基础知识

可搜索列

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

php
/**
 * The columns that should be searched.
 *
 * @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;

/**
 * Get the searchable columns for the resource.
 *
 * @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;

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableRelation('author', 'name')];
}

为了方便起见,您可以通过使用“点表示法”将字段添加到资源的 $search 属性中来定义一个应该搜索的关系。

php
/**
 * The columns that should be searched.
 *
 * @var array
 */
public static $search = [
    'id', 'author.name'
];

MorphTo 关系

可以通过从资源的 searchableColumns 方法返回一个 Laravel\Nova\Query\Search\SearchableMorphToRelation 实例来使“Morph to”关系可搜索。SearchableMorphToRelation 类允许您指定应该搜索哪些类型的变形模型。

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

/**
 * Get the searchable columns for the resource.
 *
 * @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;

/**
 * Get the searchable columns for the resource.
 *
 * @return array
 */
public static function searchableColumns()
{
    return ['id', new SearchableJson('meta->address->postcode')];
}