Eloquent 用のフィルターを作成するのに便利なライブラリです。
このライブラリは、Eloquent を使用して Rest API で検索フィルターを作成するのに役立ちます。
??
Eloquent Filter ライブラリを使用して、Laravel プロジェクトのモデルの検索条件のパターンを作成できます。アイデアは、単にリクエスト ペイロードの値を渡す集約フィルターです。
インストールには Composer を使用する必要があります。次のコマンドを実行します。
composer require laravellegends/eloquent-filter
LaravelLegendsEloquentFilterConcernsHasFilter
トレイトは、検索フィルターを適用するモデルで使用できます。
use LaravelLegends EloquentFilter Concerns HasFilter ;
class User extends Model
{
use HasFilter ;
}
HasFilter
トレイトはfilter
とwithFilter
メソッドを提供します。
Laravel アプリケーションでこのライブラリを使用する簡単な方法は、モデルの結果を取得する前にfilter
メソッドを呼び出すことです。
例:
class UsersController extends Controller
{
use App Models User ;
public function index ()
{
return User :: filter ()-> paginate ();
}
// or
public function index ()
{
return User :: latest ( ' id ' )-> filter ()-> paginate ();
}
// or
public function index ( Request $ request )
{
return User :: filter ( $ request )-> paginate ();
}
}
/api/users?exact[id]=1
呼び出すと結果を表示できます。 SQL クエリ"select * from users where (id = 1)"
が適用されます。
注: 詳細については、ルール セッションを表示してください。
もう 1 つの方法は、モデルに特定のフィルターを使用することです。 ModelFilter クラスを継承して、モデルのカスタム フィルターを作成できます。
このクラスを作成するには、次の例のようにphp artisan make:filter
コマンドを使用する必要があります。
$ php artisan make:filter UserFilter
上記のコマンドは次のクラスを生成します。
namespace App Filters ;
use LaravelLegends EloquentFilter Filters ModelFilter ;
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' role_id ' => ' not_equal ' , // or ['not_equal']
' name ' => [ ' contains ' , ' starts_with ' ],
];
}
}
コントローラー内
use App Models User ;
use Illuminate Http Request ;
use LaravelLegends EloquentFilter Filter ;
class UsersController extends Controller
{
// api/users?starts_with[name]=Wallace¬_equal[role_id]=2
public function index ( Request $ request )
{
return User :: withFilter ( new UserFilter , $ request )
-> orderBy ( ' name ' )
-> get ();
}
}
上記のコードは内部的に次の例のように呼び出されます。
User :: where ( function ( $ query ) {
$ query -> where ( ' name ' , ' LIKE ' , ' Wallace% ' );
$ query -> where ( ' role_id ' , ' <> ' , ' 2 ' );
})
-> orderBy ( ' name ' )
-> get ();
このライブラリは、特別なキーワーク名のクエリ文字列パラメータに基づいてフィルタを内部的に適用します。
以下のすべてのパラメータを参照してください。
列の最大値。 URL api/users?max[field]=100
はUser::where('field', '<=', 100)
に似ています。
列の最小値。 URL api/users?min[age]=33
はUser::where('age', '>=', 33)
に似ています。
列に含まれる検索語。 URL api/users?contains[name]=wallace
はUser::where('name', 'LIKE', '%wallace%')
に似ています。
文字列の末尾の内容に応じて値を検索します。 %$value
値を使用したLIKE
に似ています。
値が特定の値で始まる場合にフィールドをフィルターします。 URL api/users?starts_with[name]=brcontainer
User::where('name', 'LIKE', 'brcontainer%')
のように聞こえます。
フィールドの正確な値で検索します。 URL api/users?exact[email][email protected]
User::where('name', '=', '[email protected]')
のように聞こえます。
関係でフィルターします。 0
または1
値を使用できます。
例:
URL api/users?has[posts]=1
User::has('posts')
と似ています
URL api/users?has[posts]=0
はUser::doesntHave('posts')
に似ています
WHERE IS NULL
またはWHERE IS NOT NULL
をクエリに適用します。
例:
URL api/users?is_null[cpf]=1
User::whereNull('cpf')
に似ています。
URL api/users?is_null[age]=0
User::whereNotNull('age')
に似ています。
渡された値が列にない場合に検索します。
例:
URL api/users?not_in[role][]=1¬_in[role][]=2
と同等のUser::whereNotIn('role', [1, 2])
注: not_in[my_field]
が空の配列の場合、アクションは実行されません。
列に渡された値がある場合に検索します。
例:
URL api/users?in[role][]=10&in[role][]=20
User::whereIn('role', [10, 20])
のように聞こえます。
注: in[my_field]
が空の配列の場合、アクションは実行されません。
日付フィールドの最大値で検索します。
URL api/users?date_max[created_at]=2021-01-01
User::whereDate('created_at', '<=', '2021-01-01')
のように聞こえます。
日付フィールドの最小値で検索します。
例:
URL api/users?date_min[created_at]=2021-01-01
User::whereDate('created_at', '>=', '2021-01-01')
のように聞こえます。
渡された値が等しくないことで検索します。関連フィールドで使用すると、whereDoesntHave が適用されます。
例:
URL api/users?not_equal[profile_id]=3
次のように聞こえます。
User :: where ( ' profile_id ' , ' <> ' , ' 3 ' );
URL api/users?not_equal[roles.id]=1
次のように聞こえます。
User :: whereDoesntHave ( ' roles ' , fn ( $ query ) => $ query -> where ( ' id ' , ' = ' , 3 ));
URL api/users?year_max[created_at]=2000
次のように聞こえます。
User :: whereYear ( ' created_at ' , ' <= ' , 2000 );
URL api/users?year_min[created_at]=1998
次のように聞こえます。
User :: whereYear ( ' created_at ' , ' >= ' , 1998 );
URL api/users?year_exact[created_at]=1998
次のように聞こえます。
User :: whereYear ( ' created_at ' , ' = ' , 1998 );
モデルで定義された関係メソッドで検索フィルターを適用できます。
例えば:
モデル:
class User extends Model
{
use HasFilter ;
public function phones ()
{
return $ this -> hasMany ( Phone ::class, ' user_id ' );
}
}
フィルター:
class UserFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' id ' => [ ' exact ' , ' not_equal ' ],
' created_at ' => [ ' year_exact ' , ' date_max ' , ' date_min ' ],
' phones.number ' => [ ' contains ' ],
// or
' phones ' => new PhoneFilter ,
];
}
}
class PhoneFilter extends ModelFilter
{
public function getFilterables (): array
{
return [
' number ' => ' contains '
];
}
}
class UserController extends Controller
{
public function index ()
{
// api/users?not_in[role_id][]=1¬_in[role_id][]=3
// select * from users where (role_id NOT IN (1, 3))
return User :: withFilter ( new UserFilter )-> paginate ();
}
// Or, apply filter as nested query
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where (role_id = 1)
return User :: where ( UserFilter :: toClosure ())-> paginate ();
}
// Or apply in your query as base condition
public function index ()
{
// api/users?exact[role_id]=1
// select * from users where role_id = 1
return User :: tap ( UserFilter :: toClosure ())-> paginate ();
}
}
次の例では、値55
含む関連する電話機でユーザーがフィルタリングされます。
api/users?exact[phones.number]=55
のようになります。
User :: where ( function ( $ query ) {
$ query -> whereHas ( ' phones ' , function ( $ query ) {
$ query -> where ( ' number ' , ' = ' , ' 55 ' );
});
})-> paginate ();
axios
ライブラリを使用する場合は、 params
オプションを使用して上記のフィルターを含めることができます。
例:
const api = axios . create ( {
baseURL : 'http://localhost:8000/api'
} ) ;
api . get ( 'users' , {
params : {
'in[role]' : [ 1 , 2 , 3 ] ,
'contains[name]' : 'Maxters' ,
'is_null[name]' : 0
}
} )