この Laravel パッケージを使用すると、複数の Eloquent モデルを検索できます。並べ替え、ページネーション、スコープ クエリ、一括読み込み関係、および 1 つまたは複数の列の検索をサポートします。
❤️ 私たちは、Laravel パッケージを開発し、無料で配布することでコミュニティを誇りを持ってサポートしています。このパッケージで時間を節約できる場合、またはプロとして信頼している場合は、メンテナンスと開発のスポンサーになることを検討し、最新のプレミアム パッケージである慣性テーブルをチェックしてください。問題やプル リクエストの追跡には時間がかかりますが、喜んでお手伝いいたします。
このパッケージの背景について詳しく知りたい場合は、ブログ投稿をお読みください。
パッケージは、composer 経由でインストールできます。
composer require protonemedia/laravel-cross-eloquent-search
get
メソッドの名前がsearch
に変更されました。addWhen
メソッドは削除され、 when
が使用されるようになりました。updated_at
列) によって並べ替えられます。タイムスタンプを使用しない場合は、デフォルトで主キーが使用されるようになります。 startWithWildcard
メソッドの名前がbeginWithWildcard
に変更されました。getUpdatedAtColumn
メソッドによって評価されるようになりました。以前は、 updated_at
にハードコーディングされていました。別の列を使用して並べ替えることもできます。allowEmptySearchQuery
メソッドとEmptySearchQueryException
クラスは削除されましたが、検索しなくても結果を取得できます。 検索クエリを開始するには、検索する 1 つ以上のモデルを追加します。モデルのクラス名と検索する列を指定してadd
メソッドを呼び出します。次に、検索語を指定してsearch
メソッドを呼び出すと、結果を含むIlluminateDatabaseEloquentCollection
インスタンスが得られます。
デフォルトでは、結果は更新された列の昇順で並べ替えられます。ほとんどの場合、この列はupdated_at
です。モデルのUPDATED_AT
定数をカスタマイズした場合、またはgetUpdatedAtColumn
メソッドを上書きした場合、このパッケージはカスタマイズされた列を使用します。タイムスタンプをまったく使用しない場合は、デフォルトで主キーが使用されます。もちろん、別の列で注文することもできます。
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
インデントを気にする場合は、オプションでファサードでnew
メソッドを使用できます。
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
別の条件に基づいて特定の句を適用するwhen
メソッドもあります。
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
デフォルトでは、検索語を分割し、各キーワードにワイルドカード記号を取得して部分一致を実行します。実際には、これは、検索語apple ios
結果がapple%
およびios%
になることを意味します。ワイルドカード記号も開始したい場合は、 beginWithWildcard
メソッドを呼び出すことができます。これにより、 %apple%
と%ios%
が生成されます。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
注: このパッケージの以前のバージョンでは、このメソッドはstartWithWildcard()
と呼ばれていました。
ワイルドカードが用語に追加される動作を無効にしたい場合は、 false
を指定してendWithWildcard
メソッドを呼び出す必要があります。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
複数単語の検索はデフォルトでサポートされています。フレーズを二重引用符で囲むだけです。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
dontParseTerm
メソッドを呼び出すと、検索語の解析を無効にできます。これにより、二重引用符を使用した場合と同じ結果が得られます。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
結果を別の列で並べ替える場合は、その列を 3 番目のパラメーターとしてadd
メソッドに渡すことができます。 orderByDesc
メソッドを呼び出して、結果を降順に並べ替えます。
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
orderByRelevance
メソッドを呼び出して、検索語の出現数で結果を並べ替えることができます。次の 2 つの文を想像してください。
「Apple iPad」を検索すると、検索語に一致するものがさらに多いため、2 番目の文が最初に表示されます。
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
(ネストされた) 関係を検索している場合、関連性による順序付けはサポートされません。
結果をモデル タイプで並べ替えるには、 orderByModel
メソッドを使用してモデルの優先順序を指定します。
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
結果をページ分割することを強くお勧めします。 search
メソッドの前にpaginate
メソッドを呼び出すと、結果としてIlluminateContractsPaginationLengthAwarePaginator
のインスタンスが取得されます。 paginate
メソッドは、ページネータをカスタマイズするために 3 つの (オプションの) パラメータを取ります。これらの引数は、Laravel のデータベース ページネータと同じです。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
単純なページネーションを使用することもできます。これは、長さを認識しないIlluminateContractsPaginationPaginator
のインスタンスを返します。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
クラス名の代わりに、Eloquent クエリ ビルダーのインスタンスをadd
メソッドに渡すこともできます。これにより、各モデルに制約を追加できます。
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
列の配列を 2 番目の引数として渡すことで、複数の列を検索できます。
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
ドット表記を使用して、(ネストされた) リレーションシップを検索できます。
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
addFullText
メソッドを使用すると、MySQL の全文検索を使用できます。単一または複数の列 (フルテキスト インデックスを使用) を検索でき、モードを指定するなど、一連のオプションを指定できます。 1 つのクエリで通常の検索と全文検索を混在させることもできます。
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
リレーションシップを検索する場合は、配列キーにリレーションシップが含まれ、値が列の配列である配列を渡す必要があります。
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL にはSoundexアルゴリズムが組み込まれているため、ほぼ同じように聞こえる用語を検索できます。この機能は、 soundsLike
メソッドを呼び出すことで使用できます。
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
ここではあまり説明しませんが、これもサポートされています:)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
用語を指定せずに、または空の用語を指定してsearch
メソッドを呼び出します。この場合、 add
メソッドの 2 番目の引数は破棄できます。 orderBy
メソッドを使用すると、並べ替えの基準となる列を設定できます (以前は 3 番目の引数)。
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
count
メソッドを使用して結果の数をカウントできます。
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
includeModelType
使用して、モデル タイプを検索結果に追加できます。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
デフォルトではtype
キーが使用されますが、キーをメソッドに渡すことでこれをカスタマイズできます。
パブリック メソッドsearchType()
モデルに追加して、デフォルトのクラスのベース名をオーバーライドすることで、 type
値をカスタマイズすることもできます。
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
parseTerms
メソッドでパーサーを使用できます。
$ terms = Search :: parseTerms ( ' drums guitar ' );
コールバックを 2 番目の引数として渡して、各用語をループすることもできます。
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
Inertia Table
: 組み込みのクエリ ビルダーを備えた Inertia.js の究極のテーブル。Laravel Blade On Demand
: メモリ内で Blade テンプレートをコンパイルするための Laravel パッケージ。Laravel Eloquent Scope as Select
: PHP で Eloquent クエリ スコープと制約を複製するのをやめます。このパッケージを使用すると、クエリのスコープと制約をサブクエリとして追加して再利用できます。Laravel FFMpeg
: このパッケージは、Laravel の FFmpeg との統合を提供します。ファイルのストレージは、Laravel のファイルシステムによって処理されます。Laravel MinIO Testing Tools
: MinIO S3 サーバーに対してテストを実行します。Laravel Mixins
: Laravel の便利なコレクション。Laravel Paddle
: Webhook/イベントをサポートする Laravel 用の Paddle.com API 統合。Laravel Task Runner
: ブレードコンポーネントなどのシェルスクリプトを作成し、ローカルまたはリモートサーバー上で実行します。Laravel Verify New Email
: このパッケージは、新しい電子メール アドレスを検証するためのサポートを追加します。ユーザーが電子メール アドレスを更新すると、新しいアドレスが検証されるまで古いアドレスは置き換えられません。Laravel XSS Protection
: クロスサイトスクリプティング(XSS)からアプリを保護するLaravelミドルウェア。リクエスト入力をサニタイズし、Blade echo ステートメントをサニタイズすることもできます。セキュリティ関連の問題を発見した場合は、問題トラッカーを使用する代わりに、[email protected] に電子メールを送信してください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。
このパッケージはツリーウェアです。制作に使用する場合は、私たちの仕事に感謝するために世界に木を購入してください。ツリーウェアの森に貢献することで、地元の家族に雇用を生み出し、野生動物の生息地を回復することができます。