Поиск

# Основы

Для поиска необходимо указать, какие поля модели будут участвовать в поиске. Для этого необходимо их перечислить в возвращаемом массиве в методе search().

Если метод возвращает пустой массив, то поисковая строка не будет отображаться.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Fields\Text;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected string $model = Post::class;
 
protected string $title = 'Posts';
 
//...
 
public function search(): array
{
return ['id', 'title', 'text'];
}
 
//...
}

# Полнотекстовый поиск

Если требуется fulltext поиск, то необходимо воспользоваться атрибутом MoonShine\Attributes\SearchUsingFullText.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Attributes\SearchUsingFullText;
use MoonShine\Fields\Text;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected string $model = Post::class;
 
protected string $title = 'Posts';
 
//...
 
#[SearchUsingFullText(['title', 'text'])]
public function search(): array
{
return ['id'];
}
 
//...
}

Не забудьте добавить fulltext индекс

# Поиск по ключам json

Для полей Json, которые используются как ключ-значение keyValue(), можно указать какой ключ поля участвует в поиске.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Fields\Text;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected string $model = Post::class;
 
protected string $title = 'Posts';
 
//...
 
public function search(): array
{
return ['data->title'];
}
 
//...
}

Для многомерных Json, которые формируются через поля fields(), ключ для поиска необходимо задавать следующим образом:

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Fields\Text;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected string $model = Post::class;
 
protected string $title = 'Posts';
 
//...
 
public function search(): array
{
return ['data->[*]->title'];
}
 
//...
}

# Поиск по отношениям

Поиск можно осуществлять по отношениям, для этого необходимо указать по какому полю отношения производить поиск.

namespace App\MoonShine\Resources;
 
use App\Models\Post;
use MoonShine\Fields\Text;
use MoonShine\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected string $model = Post::class;
 
protected string $title = 'Posts';
 
//...
 
public function search(): array
{
return ['category.title'];
}
 
//...
}

# Глобальный поиск

В админ-панели MoonShine глобальный поиск можно реализовать на основе интеграции Laravel Scout .

Для реализации глобального поиска необходимо:

1 Указать перечень моделей для поиска в файле конфигурации config/moonshine.php.
'global_search' => [
Article::class,
User::class
],
2 Реализовать интерфейс в моделях.
use MoonShine\Scout\HasGlobalSearch;
use MoonShine\Scout\SearchableResponse;
use Laravel\Scout\Searchable;
use Laravel\Scout\Builder;
 
class Article extends Model implements HasGlobalSearch
{
use Searchable;
 
public function searchableQuery(Builder $builder): Builder
{
return $builder->take(4);
}
 
public function toSearchableResponse(): SearchableResponse
{
return new SearchableResponse(
group: 'Articles',
title: $this->title,
url: '/',
preview: $this->text,
image: $this->thumbnail
);
}
}