このパッケージを使用すると、さまざまなソースから構造化された検索を簡単に取得できます。以下は、いくつかのモデルを検索する例です。モデル自体についてはすでにいくつかの小さな準備を行っています。
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> registerModel ( BlogPost ::class, ' title ' )
-> search ( ' john ' );
検索は大文字と小文字を区別せずに実行されます。 $searchResults
は、 name
属性にjohn
含むすべてのUser
モデルと、 title
属性に 'john' を含むBlogPost
が含まれるようになりました。
ビューで検索結果をループできるようになりました。
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< li >< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a ></ li >
</ ul >
@endforeach
@endforeach
この例ではモデルを使用しましたが、外部 API、ファイルのリスト、または値の配列の検索アスペクトを簡単に追加できます。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
パッケージは、composer 経由でインストールできます。
composer require spatie/laravel-searchable
モデル全体を検索するには、モデルにSearchable
インターフェイスを実装させる必要があります。
namespace Spatie Searchable ;
interface Searchable
{
public function getSearchResult (): SearchResult ;
}
SearchResult
のインスタンスを返す必要がある各検索可能モデルにgetSearchResult
メソッドを追加するだけで済みます。ブログ投稿モデルの場合は次のようになります。
use Spatie Searchable Searchable ;
use Spatie Searchable SearchResult ;
class BlogPost extends Model implements Searchable
{
public function getSearchResult (): SearchResult
{
$ url = route ( ' blogPost.show ' , $ this -> slug );
return new Spatie Searchable SearchResult (
$ this ,
$ this -> title ,
$ url
);
}
}
モデルを準備したら、次のように検索できます。
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' name ' )
-> search ( ' john ' );
検索は大文字と小文字を区別せずに実行されます。 $searchResults
は、 name
属性にjohn
含むすべてのUser
モデルが含まれるようになりました。
複数の属性を渡して検索することもできます。
// use multiple model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, ' first_name ' , ' last_name ' )
-> search ( ' john ' );
// or use an array of model attributes
$ searchResults = ( new Search ())
-> registerModel ( User ::class, [ ' first_name ' , ' last_name ' ])
-> search ( ' john ' );
きめ細かい制御を行うには、呼び出し可能オブジェクトを使用することもできます。この方法では、完全一致の検索、スコープの適用、即時読み込み関係の適用、さらにはクエリ ビルダーを使用する場合と同様にクエリのフィルタリングを行うこともできます。
$ search = ( new Search ())
-> registerModel ( User ::class, function ( ModelSearchAspect $ modelSearchAspect ) {
$ modelSearchAspect
-> addSearchableAttribute ( ' name ' ) // return results for partial matches on usernames
-> addExactSearchableAttribute ( ' email ' ) // only return results that exactly match the e-mail address
-> active ()
-> has ( ' posts ' )
-> with ( ' roles ' );
});
検索アスペクトとして基本モデルを登録することだけに限定されるわけではありません。 SearchAspect
クラスを拡張することで、独自のカスタム検索アスペクトを簡単に作成できます。
外部 API を検索するには、次のカスタム検索の側面を考慮してください。
class OrderSearchAspect extends SearchAspect
{
public function getResults ( string $ term ): Collection
{
return OrderApi :: searchOrders ( $ term );
}
}
使用方法は次のとおりです。
$ searchResults = ( new Search ())
-> registerAspect ( OrderSearchAspect ::class)
-> search ( ' john ' );
検索を実行する前にlimitAspectResults
を呼び出すことで、各アスペクトによって返される結果の量を制限できます。
$ searchResults = ( new Search ())
-> registerAspect ( BlogPostAspect ::class)
-> limitAspectResults ( 50 )
-> search ( ' How To ' );
検索結果のレンダリングの例を次に示します。
< h1 >Search</ h1 >
There are {{ $searchResults -> count () } } results.
@foreach ( $searchResults -> groupByType () as $type => $modelSearchResults )
< h2 > {{ $type } } </ h2 >
@foreach ( $modelSearchResults as $searchResult )
< ul >
< a href = " {{ $searchResult -> url } } " > {{ $searchResult -> title } } </ a >
</ ul >
@endforeach
@endforeach
$type
カスタマイズするには、モデルまたはカスタム検索アスペクトにパブリック プロパティ$searchableType
を追加します。
class BlogPost extends Model implements Searchable
{
public $ searchableType = ' custom named aspect ' ;
}
composer test
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。