このパッケージは、Laravel 4/5/6 の Eloquent モデルに検索/フィルタリング機能を追加します。
これらのパッケージも役に立つかもしれません:
プロジェクトのcomposer.json
ファイルに次の行を追加します。
"jedrzej/searchable": "0.0.17"
または、プロジェクトのルート フォルダーのコマンドラインで次のコマンドを実行します。
composer require "jedrzej/searchable" "0.0.17"
Eloquent モデルを検索可能にするには、モデルに特性を追加し、モデルをフィルターできるフィールドのリストを定義します。検索可能なフィールドのリストを定義するロジックを実行する場合は、$searchable プロパティを定義するか、getSearchableAttributes メソッドを実装できます。
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of searchable fields...
public $ searchable = [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
// ...or a method that returns a list of searchable fields
public function getSearchableAttributes ()
{
return [ ' title ' , ' forum_id ' , ' user_id ' , ' created_at ' ];
}
}
すべてのフィールドを検索可能にするには、検索可能なフィールドのリストにアスタリスク * を入力します。
public $ searchable = [ ' * ' ];
モデルの属性をブラックリストに登録して、フィルタリングされないようにすることもできます。
検索可能なフィールドのリストを定義するロジックを実行する場合は、$notSearchable プロパティを定義するか、getNotSearchableAttributes メソッドを実装できます。
use Jedrzej Searchable SearchableTrait ;
class Post extends Eloquent
{
use SearchableTrait ;
// either a property holding a list of not searchable fields...
public $ notSearchable = [ ' created_at ' ];
// ...or a method that returns a list of not searchable fields
public function getNotSearchableAttributes ()
{
return [ ' created_at ' ];
}
}
両方のリスト (検索可能な列と検索不可能な列) を定義すると、結果として得られる検索可能なフィールドのセットには、ブラックリストに登録されているすべての属性を除く、ホワイトリストに登録されているすべての属性が含まれます。
SearchableTrait
filtered()
スコープをモデルに追加します。これにフィルター条件の配列であるクエリを渡すことができます。
// return all posts with forum_id equal to $forum_id
Post :: filtered ([ ' forum_id ' => $ forum_id ])-> get ();
// return all posts with with <operator> applied to forum_id
Post :: filtered ([ ' forum_id ' => <operator>])-> get ();
または、デフォルトとしてRequest::all()
を使用します。
// if you append ?forum_id=<operator> to the URL, you'll get all Posts with <operator> applied to forum_id
Post :: filtered ()-> get ();
デフォルトのクエリ モードでは、すべてのクエリの結合 ( AND
) が検索可能なモデルに適用されます。 mode
クエリパラメータの値をor
に設定することで論理和 ( OR
) に変更できます。 mode
クエリ パラメーターがすでに使用されている場合は、 getQueryMode
メソッドによって返された名前が使用されます。
SearchableTrait
次の演算子をサポートしています。
比較演算子を使用すると、モデルの属性とクエリ値の比較結果に基づいてフィルタリングできます。これらは文字列、数値、日付に対して機能します。形式は次のとおりです。
(<operator>)<value>
次の比較演算子が使用できます。
gt
比較greater than
を意味しますge
greater than or equal
比較lt
比較less than
場合、例:le
les than or equal
比較2015 年以降の投稿をフィルターするには、次のクエリを使用する必要があります。
?created_at=(ge)2015-01-01
検索可能な特性を使用すると、クエリ パラメーターとして渡された値のタイプに応じて、属性の正確な値または一連の値によるフィルター処理が可能になります。値にカンマが含まれている場合、パラメータはカンマで分割され、 IN
フィルタリングの配列入力として使用されます。それ以外の場合は、完全一致が適用されます。
ID 42 のユーザーからの投稿をフィルターするには、次のクエリを使用する必要があります。
?user_id=42
ID 7 または 8 のフォーラムからの投稿をフィルターするには、次のクエリを使用する必要があります。
?forum_id=7,8
Like 演算子を使用すると、 LIKE
クエリを使用したフィルタリングが可能になります。この演算子は、完全一致演算子が使用されているが、値の最初または最後の文字に%
記号が含まれている場合にトリガーされます。
How
で始まる投稿をフィルタリングするには、次のクエリを使用する必要があります。
?title=How%
Notice:
パーセント文字は URL 内の特殊文字をエンコードするために使用されるため、リクエストを送信するときは、使用するツールがencode the % character as %25
を確認してください。
Null 演算子(null)
を使用すると、属性が null のモデルをフィルタリングできます。
添付ファイルのない投稿をフィルタリングするには、次のクエリを使用する必要があります。
?attachment_id=(null)
演算子の先頭に!
。
いくつかの例:
//filter posts from all forums except those with id 7 or 8
?forum_id=!7,8
//filter posts older than 2015
?created_at=!(ge)2015
//filter posts with attachment
?attachment_id=!(null)
単一モデルの属性に複数の制約を適用することができます。これを実現するには、単一のフィルターではなくクエリ フィルターの配列を提供します。
// filter all posts from year 20** except 2013
?created_at[]=20%&created_at[]=!2013%
モデルのリレーションの属性によってフィルタリングすることが可能です - Eloquent のwhereHas()
が適用されます。リレーションでフィルタリングするには、 searchable
フィールドのリストにリレーション属性をrelation:attribute
の形式で追加します。そのリレーションの属性でフィルタリングするには、クエリで同じ文字列を使用する必要があります。例:
// allow filtering on user's active field
protected $searchable = ['user:active'];
// filter only posts of active users
?user:active=1
Eloquent のwhereDoesntHave()
適用することで、一致関係のないオブジェクトの検索とフィルターを無効にすることもできます。これを行うには、リレーション名の先頭に!
を付けます。 :
// allow filtering on comment's approved field
protected $searchable = ['comments:approved'];
// filter only posts that have approved comments
?comments:approved=1
// filter only posts that have not-approved comments
?comments:approved=1
// filter only posts that do not have approved comments
?!comments:approved=1
ネストされたリレーションによってフィルタリングする場合は、ドットをコロンに置き換えてネストされたリレーションの名前を指定するだけです。 PHP は URL 内のドットを自動的にアンダースコアに置き換えるので、これは必要です。
// filter only posts that have comments from active authors
?comments:author:active=1
たとえば、フィルタ名がフィルタリングに使用される属性の名前と一致しない場合や、いくつかのカスタム操作を実行する必要がある場合など、選択したフィルタを独自のロジックで処理することが可能です。フィルターxyz
のロジックをオーバーライドするには、モデル内でprocessXyzFilter
というメソッドを定義する必要があります。フィルターが処理され、デフォルトのロジックが発生しない場合、このメソッドはtrue
を返す必要があります。
// use one filter to search in multiple columns
protected function processNameFilter ( Builder $ builder , Constraint $ constraint )
{
// this logic should happen for LIKE/EQUAL operators only
if ( $ constraint -> getOperator () === Constraint :: OPERATOR_LIKE || $ constraint -> getOperator () === Constraint :: OPERATOR_EQUAL ) {
$ builder -> where ( function ( $ query ) use ( $ constraint ) {
$ query -> where ( ' first_name ' , $ constraint -> getOperator (), $ constraint -> getValue ())
-> orWhere ( ' last_name ' , $ constraint -> getOperator (), $ constraint -> getValue ());
});
return true ;
}
// default logic should be executed otherwise
return false ;
}
関係検索のフィルターをオーバーライドするには、フィルター名のコロンをアンダースコアに置き換えます。 user:active
のロジックをオーバーライドしたい場合は、 processUser_ActiveFilter
メソッドを定義する必要があります。