ModelResource

Поиск

Основы

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

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

 namespaces
namespace App\MoonShine\Resources;
 
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function search(): array
{
return ['id', 'title', 'text'];
}
}

MoonShine Search MoonShine Search

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

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

 namespaces
namespace App\MoonShine\Resources;
 
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\Support\Attributes\SearchUsingFullText;
 
class PostResource extends ModelResource
{
// ...
 
#[SearchUsingFullText(['title', 'text'])]
protected function search(): array
{
return ['id'];
}
}

Не забудьте добавить полнотекстовый индекс.

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

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

 namespaces
namespace App\MoonShine\Resources;
 
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function search(): array
{
return ['data->title'];
}
}

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

 namespaces
namespace App\MoonShine\Resources;
 
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function search(): array
{
return ['data->[*]->title'];
}
}

Поиск по связям

Вы можете осуществлять поиск по связям. Для этого нужно указать, по какому полю связи осуществлять поиск.

 namespaces
namespace App\MoonShine\Resources;
 
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function search(): array
{
return ['category.title'];
}
}

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

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

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

  1. Установить пакет moonshine/scout.
composer require moonshine/scout
php artisan vendor:publish --provider="MoonShine\Scout\Providers\ScoutServiceProvider"
  1. Указать список моделей для поиска в конфигурационном файле config/moonshine-scout.php.
'models' => [
Article::class,
User::class,
],
  1. Реализовать интерфейс в моделях.
 namespaces
namespace App\Models;
 
use Laravel\Scout\Builder;
use Laravel\Scout\Searchable;
use MoonShine\Scout\HasGlobalSearch;
use MoonShine\Scout\SearchableResponse;
 
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,
);
}
}
  1. Заменить компонент Search в Layout.
protected function getSearchComponent(): ComponentContract
{
return MoonShine\Scout\Components\Search::make();
}