이 확장자는 YII ActivereCord에 대한 통합 검색 모델을 제공합니다.
라이센스 정보는 라이센스 파일을 확인하십시오.
이 확장을 설치하는 선호하는 방법은 작곡가를 통하는 것입니다.
어느 쪽이든
php composer.phar require --prefer-dist yii2tech/ar-search
또는 추가
"yii2tech/ar-search" : " * "Composer.json의 요구 사항 섹션.
이 확장자는 특수 모델 클래스 - yii2techarsearchActiveSearchModel 통해 yii activerecord에 대한 통합 검색 모델을 제공합니다.
이 모델은 yii2techarsearchActiveSearchModel::$model 통해 지정된 '슬레이브'소스 ActiveRecord 모델에서 속성, 검증 규칙 및 필터링 로직을 가져올 수 있습니다. 따라서 필터 로직을 검색하고 정의하기 위해 분리 된 모델 클래스를 선언 할 필요가 없습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel '슬레이브'모델의 모든 '안전한'속성을 선택하여 자체 속성으로 사용합니다. 따라서이 클래스의 범위에서 관련 ActiveRecord 모델에서 '안전'으로 표시된 모든 속성을 사용할 수 있습니다. 예를 들어:
<?php
namespace appmodels;
// ActiveRecord to be searched:
class Item extends yiidb ActiveRecord
{
public function rules ()
{
return [
[[ ' name ' , ' status ' , ' price ' ], ' required ' ],
[ ' name ' , ' string ' ],
[ ' status ' , ' integer ' ],
[ ' price ' , ' number ' ],
];
}
}
use yii2techarsearch ActiveSearchModel ;
// Create search model for declared ActiveRecord:
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
// safe attributes of `Item` are inherited:
$ searchModel -> name = ' Paul ' ;
$ searchModel -> price = 10.5 ;웹 양식을 작성하는 동안 상속 된 속성을 사용할 수 있으며, 이는 필터 데이터를 수집해야합니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiiwidgets ActiveForm ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
?>
<?php $ form = ActiveForm :: begin (); ?>
<?= $ form -> field ( $ model , ' name ' )-> textInput () ?>
<?= $ form -> field ( $ model , ' price ' )-> textInput () ?>
...
<?php ActiveForm :: end (); ?>속성 레이블 및 힌트는 또한 '슬레이브'모델에서 상속됩니다.
yii2techarsearchActiveSearchModel 의 주요 방법은 search() 입니다. 주어진 데이터 배열에서 필터 속성을로드하고 확인을 확인합니다. a yiidataActiveDataProvider 인스턴스를 쿼리 필터 조건으로 적용합니다.
ActiveSearchModel yii2techarsearchActiveSearchModel::$searchAttributeTypes 로 지정된 속성 유형을 기반으로 쿼리 필터링에 정교한 논리를 사용합니다. yii2techarsearchActiveSearchModel::$model 에서 값이 추출됩니다. yii2techarsearchActiveSearchModel::$filterOperators . 기본적으로 yiidbQueryInterface::andFilterWhere() 필터 구성에 사용됩니다. '문자열'속성의 경우 '좋아요'연산자와 함께 사용됩니다. 'Integer'및 'float'( 'double') 메소드의 경우 사용 가능한 경우 andFilterCompare() 사용됩니다.
헤드 일어나! ActiveSearchModel 사용법을 남용하지 마십시오. 검색 논리가 사소한 경우 가장 간단한 케이스 만 포함하도록 설계되었습니다. 경우에 따라 항상 분리 된 검색 모델을 만들어야합니다. 검색 쿼리의 복잡한 논리가 필요합니다.
search() 메소드에 의해 생성 된 데이터 제공자의 일부 설정을 변경할 수 있습니다 : 페이지 매김 또는 정렬 설정 등을 변경하십시오. yii2techarsearchActiveSearchModel::$dataProvider 통해이 작업을 수행 할 수 있습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' dataProvider ' => [
' class ' => ' yiidataActiveDataProvider ' ,
' pagination ' => [
' defaultPageSize ' => 40
],
],
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams );
echo $ dataProvider -> pagination -> defaultPageSize ; // outputs `40` yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY 이벤트를 사용하여 검색 쿼리 인스턴스를 조정하여 관계 간절한 하중 또는 영구 조건을 추가 할 수 있습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
use yii2techarsearch ActiveSearchEvent ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
]);
$ searchModel -> on ( ActiveSearchModel :: EVENT_AFTER_CREATE_QUERY , function ( ActiveSearchEvent $ event ) {
$ event -> query
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
}); 또한 yii2techarsearchActiveSearchModel::$dataProvider 통해 쿼리 객체를 직접 지정할 수도 있습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' model ' => Item :: className (),
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]); yii2techarsearchActiveSearchModel::$filterOperators 통해 쿼리 필터링에 사용할 연산자를 제어 할 수 있습니다. yiidbQueryInterface::andFilterWhere() 와 함께 사용할 속성 유형과 연산자 사이의 매핑을 정의합니다. 각 값은 쿼리 인스턴스, 속성 이름 및 값을 수락하는 스칼라 연산자 이름 또는 PHP 콜백이 될 수 있습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' filterOperators ' => [
ActiveSearchModel :: TYPE_STRING => ' = ' , // use strict comparison for the string attributes
ActiveSearchModel :: TYPE_INTEGER => function ( yiidb ActiveQueryInterface $ query , $ attribute , $ value ) {
if ( $ attribute === ' commentsCount ' ) {
$ query -> andHaving ([ ' commentsCount ' => $ value ]);
} else {
$ query -> andFilterWhere ([ $ attribute => $ value ]);
}
},
],
]); ActiveSearchModel 쿼리의 andFilterCompare() 메소드를 사용하는 속성을 필터링 할 수 있습니다 (예 : {operator}{value} >10 yiidbQuery::andFilterCompare() <=100 ). 그러한 비교의 사용이 허용되는 속성 이름의 목록은 yii2techarsearchActiveSearchModel::$compareAllowedAttributes 에 의해 제어됩니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem ' ,
' compareAllowedAttributes ' => [
' price ' // allow compare for ' price ' only, excluding such fields like ' categoryId ' , ' status ' and so on.
],
]); compareAllowedAttributes * 로 설정할 수 있으며, 이는 플로트 또는 정수 속성을 비교할 수 있음을 나타냅니다.
참고 :
yii2techarsearchActiveSearchModel::$filterOperatorsyii2techarsearchActiveSearchModel::$compareAllowedAttributes보다 우선합니다.
대부분의 경우 yii2techarsearchActiveSearchModel::$model 의 설정은 ActiveSearchModel 인스턴스를 구성하는 가장 빠른 방법이지만 필수는 아닙니다. '슬레이브'모델의 설정을 피하고 모든 검색 관련 속성을 직접 구성 할 수 있습니다. 예를 들어:
<?php
use yii2techarsearch ActiveSearchModel ;
use yiidata ActiveDataProvider ;
use appmodels Item ;
$ searchModel = new ActiveSearchModel ([
' searchAttributeTypes ' => [
' id ' => ActiveSearchModel :: TYPE_INTEGER ,
' name ' => ActiveSearchModel :: TYPE_STRING ,
' price ' => ActiveSearchModel :: TYPE_FLOAT ,
],
' rules ' => [
[ ' id ' , ' integer ' ],
[ ' name ' , ' string ' ],
[ ' price ' , ' number ' ],
],
' compareAllowedAttributes ' => [],
' dataProvider ' => function () {
$ query = Item :: find ()
-> with ([ ' category ' ])
-> andWhere ([ ' status ' => 1 ]);
return ActiveDataProvider ([ ' query ' => $ query ]);
},
]);