To perform a search, you need to specify which fields of the model will participate in the search.
For this, you need to list them in the returned array in the search()
method.
If the method returns an empty array, the search string will not be displayed.
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
protected function search(): array
{
return ['id', 'title', 'text'];
}
}
namespaces
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['id', 'title', 'text'];
}
}
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['id', 'title', 'text'];
}
}

If full-text search is required, you need to use the attribute SearchUsingFullText
.
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'];
}
}
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'];
}
}
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'];
}
}
Don't forget to add a full-text index.
For Json
fields that are used as key-value keyValue()
, you can specify which field key participates in the search.
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 ['data->title'];
}
}
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['data->title'];
}
}
For multidimensional Json
, which are formed through fields()
, the search key should be specified as follows:
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 ['data->[*]->title'];
}
}
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['data->[*]->title'];
}
}
You can perform a search on relations. For this, you need to specify which relation field to search by.
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
protected function search(): array
{
return ['category.title'];
}
}
namespaces
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['category.title'];
}
}
namespace App\MoonShine\Resources;
use MoonShine\Laravel\Resources\ModelResource;
class PostResource extends ModelResource
{
// ...
protected function search(): array
{
return ['category.title'];
}
}
In MoonShine, you can implement global search based on integration with Laravel Scout.
To implement global search, you need to:
- Install the
moonshine/scout
package.
composer require moonshine/scout
composer require moonshine/scout
composer require moonshine/scout
php artisan vendor:publish --provider="MoonShine\Scout\Providers\ScoutServiceProvider"
php artisan vendor:publish --provider="MoonShine\Scout\Providers\ScoutServiceProvider"
php artisan vendor:publish --provider="MoonShine\Scout\Providers\ScoutServiceProvider"
- Specify the list of models for searching in the configuration file
config/moonshine-scout.php
.
'models' => [
Article::class,
User::class,
],
'models' => [
Article::class,
User::class,
],
'models' => [
Article::class,
User::class,
],
- Implement the interface in the models.
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,
);
}
}
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,
);
}
}
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,
);
}
}
- Replace the
Search
component in Layout
.
protected function getSearchComponent(): ComponentContract
{
return MoonShine\Scout\Components\Search::make();
}
protected function getSearchComponent(): ComponentContract
{
return MoonShine\Scout\Components\Search::make();
}
protected function getSearchComponent(): ComponentContract
{
return MoonShine\Scout\Components\Search::make();
}