要定义可搜索的资源字段,可将数据库列数组分配给资源类的 search 属性。该数组默认包含 id 列:
/**
* 可以搜索的字段。
*
* @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 在查询给定字段时使用你的全文索引:
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 属性:
use Laravel\Nova\Query\Search\SearchableRelation;
/**
* 获取资源的可搜索字段。
*
* @return array
*/
public static function searchableColumns()
{
return ['id', new SearchableRelation('author', 'name')];
}为方便起见,你可以使用「点符号」将字段添加到资源的 $search 属性中,从而定义应搜索的关联:
/**
* 可以搜索的字段。
*
* @var array
*/
public static $search = [
'id', 'author.name'
];通过从资源的 searchableColumns 方法返回 Laravel\Nova\Query\Search\SearchableMorphToRelation 实例,可以搜索「多态」关系。SearchableMorphToRelation 类允许你指定应该搜索哪些类型的多态关联模型:
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 字符串的列,你可以从资源的 searchableColumns 方法中返回一个 Laravel\Nova\Query\Search\SearchableJson 实例,指示 Nova 在 JSON 字符串中进行搜索。
如果资源中不存在 searchableColumns 方法,则应定义该方法。一旦定义了 searchableColumns 方法,你就可以删除资源中的 $search 属性:
use Laravel\Nova\Query\Search\SearchableJson;
/**
* 获取资源的可搜索字段。
*
* @return array
*/
public static function searchableColumns()
{
return ['id', new SearchableJson('meta->address->postcode')];
}