이 패키지는 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
greater than or equal
비교를 위한 ge
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()
적용됩니다. 관계별로 필터링하려면 relation:attribute
형식으로 searchable
필드 목록에 관계 속성을 추가하세요. 해당 관계의 속성을 기준으로 필터링하려면 쿼리에 동일한 문자열을 사용해야 합니다. 예:
// 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
메서드를 정의해야 합니다.