Esta extensão fornece um modelo de pesquisa unificado para o YII ActiveRecord.
Para informações de licença, verifique o arquivo de licença.
A maneira preferida de instalar esta extensão é através do compositor.
Correr
php composer.phar require --prefer-dist yii2tech/ar-search
ou adicione
"yii2tech/ar-search" : " * "para a seção de necessidade do seu compositor.json.
Esta extensão fornece um modelo de pesquisa unificado para o YII ActiveRecord por meio de classe de modelo especial - yii2techarsearchActiveSearchModel .
Este modelo é capaz de buscar seus atributos, regras de validação e lógica de filtragem do modelo de activerecord 'escravo' especificado por yii2techarsearchActiveSearchModel::$model . Portanto, você não precisa declarar uma classe de modelo separada para pesquisa e definir uma lógica de filtro. Por exemplo:
<?php
use yii2techarsearch ActiveSearchModel ;
$ searchModel = new ActiveSearchModel ([
' model ' => ' appmodelsItem '
]);
$ dataProvider = $ searchModel -> search ( Yii :: $ app -> request -> queryParams ); ActiveSearchModel escolhe todos os atributos 'seguros' do modelo 'escravo' e os usa como atributos próprios. Assim, você pode usar qualquer atributo, marcado como "seguro" no modelo ActiveRecord relacionado no escopo desta classe. Por exemplo:
<?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 ;Os atributos herdados podem ser usados ao compor formulários da Web, que devem coletar dados de filtro. Por exemplo:
<?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 (); ?>Os rótulos e dicas de atributos também são herdados do modelo 'escravo'.
O principal método de yii2techarsearchActiveSearchModel é search() . Ele carrega atributos de filtro da determinada matriz de dados, valida -os e cria uma instância yiidataActiveDataProvider aplicando os próprios atributos como uma condição de filtro de consulta.
ActiveSearchModel usa uma lógica sofisticada para a filtragem de consultas, com base nos tipos de atributos, especificados por yii2techarsearchActiveSearchModel::$searchAttributeTypes , que o valor é extraído de yii2techarsearchActiveSearchModel::$model yii2techarsearchActiveSearchModel::$filterOperators . Por padrão yiidbQueryInterface::andFilterWhere() será usado para a composição do filtro. Para os atributos 'string', ele será usado com o operador 'como'. Para 'Inteiro' e 'Float' ('Double') Método andFilterCompare() serão usados, se estiver disponível.
Atenção! Não abuse o uso ActiveSearchModel . Ele foi projetado para cobrir apenas os casos mais simples, quando a lógica de pesquisa é trivial. Você sempre deve criar um modelo de pesquisa separado, caso requer uma lógica complexa da composição da consulta de pesquisa.
Você pode alterar algumas configurações do provedor de dados, criado pelo método search() : altere as configurações de paginação ou classificação e assim por diante. Você pode fazer isso via yii2techarsearchActiveSearchModel::$dataProvider . Por exemplo:
<?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` Você pode usar yii2techarsearchActiveSearchModel::EVENT_AFTER_CREATE_QUERY Evento para ajustar a instância da consulta de pesquisa adicionando relação de relação de relação ou permanente. Por exemplo:
<?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 ]);
}); Você também pode especificar o objeto de consulta diretamente via yii2techarsearchActiveSearchModel::$dataProvider . Por exemplo:
<?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 ]);
},
]); Você pode controlar os operadores a serem usados para a filtragem de consulta via yii2techarsearchActiveSearchModel::$filterOperators . Ele define um mapeamento entre o tipo de atributo e o operador a ser usado com yiidbQueryInterface::andFilterWhere() . Cada valor pode ser um nome escalar do operador ou um retorno de chamada PHP, aceitando instância de consulta, nome de atributo e valor. Por exemplo:
<?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 permite filtrar os atributos usando o método andFilterCompare() da consulta (por exemplo: yiidbQuery::andFilterCompare() ), que permite especificar o valor do filtro no formato: {operator}{value} (por exemplo: >10 , <=100 e assim por diante). A lista de nomes de atributos, para os quais o uso dessa comparação é permitido é controlado por yii2techarsearchActiveSearchModel::$compareAllowedAttributes . Por exemplo:
<?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.
],
]); Você pode definir compareAllowedAttributes para * , o que indica que qualquer atributo de flutuação ou número inteiro será permitido para comparação.
Nota:
yii2techarsearchActiveSearchModel::$filterOperatorsTem precedência sobreyii2techarsearchActiveSearchModel::$compareAllowedAttributes.
Embora na maioria dos casos a configuração de yii2techarsearchActiveSearchModel::$model é a maneira mais rápida de configurar a instância ActiveSearchModel , ela não é obrigatória. Você pode evitar a configuração do modelo 'escravo' e configurar todas as propriedades relacionadas à pesquisa diretamente. Por exemplo:
<?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 ]);
},
]);