要定义哪些资源字段可搜索,您可以将数据库列的数组分配给资源类的 search
属性。此数组默认包含 id
列
/**
* 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 在查询给定列时使用您的全文索引。
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
属性。
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
属性中来定义一个应该搜索的关系。
/**
* The columns that should be searched.
*
* @var array
*/
public static $search = [
'id', 'author.name'
];
可以通过从资源的 searchableColumns
方法返回一个 Laravel\Nova\Query\Search\SearchableMorphToRelation
实例来使“Morph to”关系可搜索。SearchableMorphToRelation
类允许您指定应该搜索哪些类型的变形模型。
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 字符串的列,您可以通过从资源的 searchableColumns
方法返回一个 Laravel\Nova\Query\Search\SearchableJson
实例来指示 Nova 在 JSON 字符串中搜索。
如果您的资源上不存在 searchableColumns
方法,您应该定义它。一旦定义了 searchableColumns
方法,您就可以从您的资源中删除 $search
属性。
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')];
}