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)"
적용됩니다.
참고: 자세한 내용은 규칙 세션을 참조하세요.
또 다른 방법은 모델에 특정 필터를 사용하는 것입니다. 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
}
} )